【问题标题】:How do I let views keep their states in a Fragment?如何让视图将其状态保持在片段中?
【发布时间】:2015-04-06 02:20:38
【问题描述】:

视图(在本例中为 ViewPagers)有自己的保存和恢复状态的实现,我依靠它在设备旋转后将 ViewPager 保持在同一页面上。

当 ViewPager 在 Activity 中时,它工作得非常好。我会滚动到一个页面,旋转设备,它仍然会在那个页面上。 onSaveInstanceState 中不需要代码。

我已经将该 Activity 转换为片段。现在,ViewPager 没有保持它的状态!如果我滚动到一个页面并旋转设备,它会返回到第 1 页。

我知道我可以保存和恢复onSaveInstanceStateonCreateView 中的页面,但我宁愿让视图自己完成,尤其是当我添加更多视图并且它变得更加复杂时。

如何使用片段恢复此视图恢复功能?

这是我的片段:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Dashboard extends Fragment {

    private PagerAdapter pagerAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        pagerAdapter = new PagerAdapter(getChildFragmentManager());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dashboard, container, false);

        // irrelevant bits removed

        ViewPager pager = (ViewPager) view.findViewById(R.id.dashboard_pager);
        pager.setOffscreenPageLimit(3);
        pager.setAdapter(pagerAdapter);

        PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) view.findViewById(R.id.dashboard_tabs);
        tabs.setShouldExpand(true);
        tabs.setViewPager(pager);

        return view;
    }

    class PagerAdapter extends FragmentStatePagerAdapter implements PagerSlidingTabStrip.CustomTabProvider {

        public PagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return Fragment.instantiate(getActivity(), Fragment1.class.getName());
                case 1:
                    return Fragment.instantiate(getActivity(), Fragment2.class.getName());
                case 2:
                    return Fragment.instantiate(getActivity(), Fragment3.class.getName());
            }

            return null;
        }

        @Override
        public int getCount() {
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "*removed*";
                case 1:
                    return "*removed*";
                case 2:
                    return "*removed*";
            }

            return null;
        }

        @Override
        public View getCustomTabView(ViewGroup viewGroup, int i) {
            return getActivity().getLayoutInflater().inflate(R.layout.tab, viewGroup, false);
        }
    }
}

【问题讨论】:

  • stackoverflow.com/a/9646622/609782 已检查此答案?如果您想在onSavedInstanceState() 中查找您的片段是否还活着,您可以避免它。除此之外,我假设您知道android:configChanges= "orientation|screenSize"
  • 太棒了,这让我走上了正轨!当我使用导航抽屉时,我不得不对其进行一些调整,但基本上按标签检查片段并在未找到时重新创建它似乎工作正常。谢谢!如果你回答我会接受。

标签: java android android-fragments


【解决方案1】:

Have you checked this answer?

如果你在onSavedInstanceState() 中发现你的片段是否还活着,你可以避免它。

除此之外,我假设您知道android:configChanges= "orientation|screenSize"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多