片段不是在viewpager恢复其状态时,背面pressed并重新开放 [英] Fragment is not restoring its state in a viewpager when back is pressed and reopened

查看:208
本文介绍了片段不是在viewpager恢复其状态时,背面pressed并重新开放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想保持一个视图寻呼机片段中。和视图寻呼机本身含有其他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 mTab​​Host;
    私人ViewPager mViewPager;
    公共静态最后弦乐EXTRA_COMBO_ARGS =combo_args;
    捆束;
    捆绑额外的;
    公共静态最后弦乐EXTRA_INITIAL_VIEW =initial_view;
    公共静态BookmarkFragment bookmarkFragmentForPageA = NULL;
    公共静态BookmarkFragment bookmarkFragmentForPageB = NULL;
    控制器控制器;
    TabsAdapter mTab​​sAdapter;
    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 mTab​​Host;
        私人最终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信息= mTab​​s.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位置= mTab​​Host.getCurrentTab();
            mViewPager.setCurrentItem(位置);
        }        @覆盖
        公共无效onPageScrolled(INT位置,浮positionOffset,诠释positionOffsetPixels){
        }        @覆盖
        公共无效使用onPageSelected(INT位置){
            //不幸的是,当TabHost改变当前选项卡,它亲切
            //也需要把重点放在它的时候没有联系方式的照顾。
            //将混蛋。
            //这个黑客试图prevent这从拉焦点移出我们的
            // ViewPager。
            TabWidget插件= mTab​​Host.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,核心的Andr​​oid团队成员的指示。

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆