片段不是在viewpager恢复其状态时,背面pressed并重新开放 [英] Fragment is not restoring its state in a viewpager when back is pressed and reopened
问题描述
我想保持一个视图寻呼机片段中。和视图寻呼机本身含有其他3个片段。这是一个包含视图寻呼机根片段
进口android.support.v13.app.FragmentPagerAdapter;
进口android.support.v13.app.FragmentStatePagerAdapter;
进口android.support.v4.view.PagerAdapter;
进口android.support.v4.view.ViewPager;进口com.android.browser1.UI.ComboViews;
公共类MyFragment扩展片段器具
TabHost.OnTabChangeListener,ViewPager.OnPageChangeListener,CombinedBookmarksCallbacks {
私人TabHost mTabHost;
私人ViewPager mViewPager;
公共静态最后弦乐EXTRA_COMBO_ARGS =combo_args;
捆束;
捆绑额外的;
公共静态最后弦乐EXTRA_INITIAL_VIEW =initial_view;
公共静态BookmarkFragment bookmarkFragmentForPageA = NULL;
公共静态BookmarkFragment bookmarkFragmentForPageB = NULL;
控制器控制器;
TabsAdapter mTabsAdapter;
FirstFragment第一;
SecondFragment Seconde系列;
ThirdFragment第三; 公共无效setBundle(束束){
额外=束; // getActivity()getIntent()getExtras()。
this.bundle = extra.getBundle(EXTRA_COMBO_ARGS);
} @覆盖
公共无效onActivityCreated(捆绑savedInstanceState){
super.onActivityCreated(savedInstanceState);
mTabHost.setup();
mViewPager.setOffscreenPageLimit(2);
mTabsAdapter =新TabsAdapter(getActivity(),mTabHost,mViewPager); 新setAdapterTask()执行();
} @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
查看查看= inflater.inflate(R.layout.bookmark_view_pager,NULL);
mTabHost =(TabHost)view.findViewById(R.id.tabHost);
mViewPager =(ViewPager)view.findViewById(R.id.viewpager);
view.setBackgroundColor(Color.BLACK);
返回视图。
} 私有类setAdapterTask扩展的AsyncTask<太虚,太虚,太虚> {
保护无效doInBackground(虚空...... PARAMS){
返回null;
} @覆盖
保护无效onPostExecute(虚空结果){
。字符串书签= getResources()的getString(R.string.tab_bookmarks);
。字符串历史= getResources()的getString(R.string.tab_history);
。字符串scrapmemo = getResources()的getString(R.string.tab_snapshots);
mTabsAdapter.addTab(
mTabHost.newTabSpec(书签).setIndicator(书签),BrowserBookmarksPage.class,NULL);
mTabsAdapter.addTab(
mTabHost.newTabSpec(历史).setIndicator(历史),BrowserHistoryPage.class,NULL);
mTabsAdapter.addTab(
mTabHost.newTabSpec(scrapmemo).setIndicator(scrapmemo),BrowserSnapshotPage.class,NULL);
字符串svStr = extra.getString(EXTRA_INITIAL_VIEW,NULL);
ComboViews startingView = svStr!= NULL? ComboViews.valueOf(svStr)
:ComboViews.Bookmarks;
开关(startingView){
案例书签:
mTabHost.setCurrentTab(0);
mViewPager.setCurrentItem(0);
打破;
病历:
mTabHost.setCurrentTab(1);
mViewPager.setCurrentItem(1);
打破;
案例ScrapMemo:
mTabHost.setCurrentTab(2);
mViewPager.setCurrentItem(2);
打破;
}
}
} 公共无效onTabChanged(字符串标签){
ComboViews startingView =标签!= NULL? ComboViews.valueOf(标签)
:ComboViews.Bookmarks;
开关(startingView){
案例一:
mTabHost.setCurrentTab(0);
打破;
案例二:
mTabHost.setCurrentTab(1);
打破;
案例三:
mTabHost.setCurrentTab(2);
打破;
}
} @覆盖
公共无效onPageScrolled(INT位置,浮positionOffset,诠释positionOffsetPixels){
} @覆盖
公共无效使用onPageSelected(INT位置){
this.mTabHost.setCurrentTab(位置);
} @覆盖
公共无效onPageScrollStateChanged(INT状态){
} 公共类TabsAdapter扩展FragmentStatePagerAdapter
实现TabHost.OnTabChangeListener,ViewPager.OnPageChangeListener {
私人最终上下文mContext;
私人最终TabHost mTabHost;
私人最终ViewPager mViewPager;
私人最终的ArrayList< TabInfo> mTabs =新的ArrayList< TabInfo>(); 最后一类TabInfo {
私人最终字符串标记;
私人最终类CLSS;
私人最终捆绑ARGS; TabInfo(字符串_tag,类_class,捆绑_args){
标签= _tag;
CLSS = _class;
ARGS = _args;
}
} 类DummyTabFactory实现TabHost.TabContentFactory {
私人最终上下文mContext; 公共DummyTabFactory(上下文的背景下){
mContext =背景;
} @覆盖
公共查看createTabContent(字符串标签){
视图V =新景(mContext);
v.setMinimumWidth(0);
v.setMinimumHeight(0);
返回伏;
}
} 公共TabsAdapter(活动活动,TabHost tabHost,ViewPager寻呼机){
超级(activity.getFragmentManager());
mContext =活动;
mTabHost = tabHost;
mViewPager =寻呼机;
mTabHost.setOnTabChangedListener(本);
mViewPager.setAdapter(本);
mViewPager.setOnPageChangeListener(本);
mViewPager.setOffscreenPageLimit(3);
} 公共无效addTab(TabHost.TabSpec则tabspec,类CLSS,捆绑参数){
tabSpec.setContent(新DummyTabFactory(mContext));
字符串标记= tabSpec.getTag();
TabInfo信息=新TabInfo(标签,CLSS,参数);
mTabs.add(信息);
mTabHost.addTab(则tabspec);
notifyDataSetChanged();
的getItem(0);
} @覆盖
公众诠释的getCount(){
返回mTabs.size();
} @覆盖
公共片段的getItem(INT位置){
片段FR = NULL;
TabInfo信息= mTabs.get(位置);
如果需要的话//创建一个新片段。
开关(位置){
情况下0:
FR =新FirstFragment();
fr.setArguments(info.args);
打破;
情况1:
FR =新SecondFragment();
fr.setArguments(info.args);
打破;
案例2:
FR =新ThirdFragment();
fr.setArguments(info.args);
打破;
默认:
FR =新FirstFragment();
fr.setArguments(info.args);
打破;
} 回到FR;
} @覆盖
公众诠释getItemPosition(Object对象){
如果(对象的instanceof FirstFragment
||对象的instanceof SecondFragment
||对象的instanceof ThirdFragment)
返回POSITION_NONE;
返回POSITION_UNCHANGED;
} @覆盖
公共无效onTabChanged(字符串tabId){
//当用户点击一个选项卡上调用。
INT位置= mTabHost.getCurrentTab();
mViewPager.setCurrentItem(位置);
} @覆盖
公共无效onPageScrolled(INT位置,浮positionOffset,诠释positionOffsetPixels){
} @覆盖
公共无效使用onPageSelected(INT位置){
//不幸的是,当TabHost改变当前选项卡,它亲切
//也需要把重点放在它的时候没有联系方式的照顾。
//将混蛋。
//这个黑客试图prevent这从拉焦点移出我们的
// ViewPager。
TabWidget插件= mTabHost.getTabWidget();
INT oldFocusability = widget.getDescendantFocusability();
widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
mTabHost.setCurrentTab(位置);
widget.setDescendantFocusability(oldFocusability);
} @覆盖
公共无效onPageScrollStateChanged(INT状态){
}
}
}
当我在我的活动附上这个片段是第一次,我们可以通过滑动看到所有三个片段,但后面的preSS后,我们会删除片段。在这之后再次附上的相同的活性的片段在运行时,但只有第一2片段是可见的和第3之一的内容是否为空。
我想保持一个视图寻呼机片段中。和视图寻呼机本身含有其他3个片段。
块引用>很抱歉,但其他片段的片段里面是<一个href=\"http://stackoverflow.com/questions/6847460/fragments-within-fragments/6847770#6847770\">officially不支持的,由戴安娜Hackborn,核心的Android团队成员的指示。
I am trying to keep a view pager inside a fragment. And the View pager itself contains 3 other fragment. This is the Root fragment which contain the view pager
import android.support.v13.app.FragmentPagerAdapter; import android.support.v13.app.FragmentStatePagerAdapter; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import com.android.browser1.UI.ComboViews; public class MyFragment extends Fragment implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener, CombinedBookmarksCallbacks { private TabHost mTabHost; private ViewPager mViewPager; public static final String EXTRA_COMBO_ARGS = "combo_args"; Bundle bundle; Bundle extra; public static final String EXTRA_INITIAL_VIEW = "initial_view"; public static BookmarkFragment bookmarkFragmentForPageA = null; public static BookmarkFragment bookmarkFragmentForPageB = null; Controller controller; TabsAdapter mTabsAdapter; FirstFragment first; SecondFragment seconde; ThirdFragment third; public void setBundle(Bundle bundle) { extra = bundle;// getActivity().getIntent().getExtras(); this.bundle = extra.getBundle(EXTRA_COMBO_ARGS); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mTabHost.setup(); mViewPager.setOffscreenPageLimit(2); mTabsAdapter = new TabsAdapter(getActivity(), mTabHost, mViewPager); new setAdapterTask().execute(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.bookmark_view_pager, null); mTabHost = (TabHost) view.findViewById(R.id.tabHost); mViewPager = (ViewPager) view.findViewById(R.id.viewpager); view.setBackgroundColor(Color.BLACK); return view; } private class setAdapterTask extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... params) { return null; } @Override protected void onPostExecute(Void result) { String bookmark = getResources().getString(R.string.tab_bookmarks); String history = getResources().getString(R.string.tab_history); String scrapmemo = getResources().getString(R.string.tab_snapshots); mTabsAdapter.addTab( mTabHost.newTabSpec(bookmark).setIndicator(bookmark), BrowserBookmarksPage.class, null); mTabsAdapter.addTab( mTabHost.newTabSpec(history).setIndicator(history), BrowserHistoryPage.class, null); mTabsAdapter.addTab( mTabHost.newTabSpec(scrapmemo).setIndicator(scrapmemo), BrowserSnapshotPage.class, null); String svStr = extra.getString(EXTRA_INITIAL_VIEW, null); ComboViews startingView = svStr != null ? ComboViews.valueOf(svStr) : ComboViews.Bookmarks; switch (startingView) { case Bookmarks: mTabHost.setCurrentTab(0); mViewPager.setCurrentItem(0); break; case History: mTabHost.setCurrentTab(1); mViewPager.setCurrentItem(1); break; case ScrapMemo: mTabHost.setCurrentTab(2); mViewPager.setCurrentItem(2); break; } } } public void onTabChanged(String tag) { ComboViews startingView = tag != null ? ComboViews.valueOf(tag) : ComboViews.Bookmarks; switch (startingView) { case First: mTabHost.setCurrentTab(0); break; case Second: mTabHost.setCurrentTab(1); break; case Third: mTabHost.setCurrentTab(2); break; } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { this.mTabHost.setCurrentTab(position); } @Override public void onPageScrollStateChanged(int state) { } public class TabsAdapter extends FragmentStatePagerAdapter implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener { private final Context mContext; private final TabHost mTabHost; private final ViewPager mViewPager; private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); final class TabInfo { private final String tag; private final Class clss; private final Bundle args; TabInfo(String _tag, Class _class, Bundle _args) { tag = _tag; clss = _class; args = _args; } } class DummyTabFactory implements TabHost.TabContentFactory { private final Context mContext; public DummyTabFactory(Context context) { mContext = context; } @Override public View createTabContent(String tag) { View v = new View(mContext); v.setMinimumWidth(0); v.setMinimumHeight(0); return v; } } public TabsAdapter(Activity activity, TabHost tabHost, ViewPager pager) { super(activity.getFragmentManager()); mContext = activity; mTabHost = tabHost; mViewPager = pager; mTabHost.setOnTabChangedListener(this); mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); mViewPager.setOffscreenPageLimit(3); } public void addTab(TabHost.TabSpec tabSpec, Class clss, Bundle args) { tabSpec.setContent(new DummyTabFactory(mContext)); String tag = tabSpec.getTag(); TabInfo info = new TabInfo(tag, clss, args); mTabs.add(info); mTabHost.addTab(tabSpec); notifyDataSetChanged(); getItem(0); } @Override public int getCount() { return mTabs.size(); } @Override public Fragment getItem(int position) { Fragment fr = null; TabInfo info = mTabs.get(position); // Create a new fragment if necessary. switch (position) { case 0: fr = new FirstFragment(); fr.setArguments(info.args); break; case 1: fr = new SecondFragment (); fr.setArguments(info.args); break; case 2: fr = new ThirdFragment (); fr.setArguments(info.args); break; default: fr = new FirstFragment (); fr.setArguments(info.args); break; } return fr; } @Override public int getItemPosition(Object object) { if (object instanceof FirstFragment || object instanceof SecondFragment || object instanceof ThirdFragment ) return POSITION_NONE; return POSITION_UNCHANGED; } @Override public void onTabChanged(String tabId) { // called when the user clicks on a tab. int position = mTabHost.getCurrentTab(); mViewPager.setCurrentItem(position); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { // Unfortunately when TabHost changes the current tab, it kindly // also takes care of putting focus on it when not in touch mode. // The jerk. // This hack tries to prevent this from pulling focus out of our // ViewPager. TabWidget widget = mTabHost.getTabWidget(); int oldFocusability = widget.getDescendantFocusability(); widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); mTabHost.setCurrentTab(position); widget.setDescendantFocusability(oldFocusability); } @Override public void onPageScrollStateChanged(int state) { } } }
And when I attach this fragment in my activity for the first time we can see all the three fragment by swiping but after the back press we remove the fragment. After that again I attach the fragment in the same activity at run time but only first 2 fragments are visible and the content of 3rd one is empty.
解决方案I am trying to keep a view pager inside a fragment. And the View pager itself contains 3 other fragment.
Sorry, but fragments inside of other fragments is officially not supported, as indicated by Dianne Hackborn, a core Android team member.
这篇关于片段不是在viewpager恢复其状态时,背面pressed并重新开放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!