在 ViewPager 中保存 Fragment 状态 [英] Saving Fragment state in ViewPager

查看:32
本文介绍了在 ViewPager 中保存 Fragment 状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试了 来自 API 的示例代码,但它并没有真正起作用,所以我实现了自己的:

FragmentPagerSupport

public class FragmentPagerSupport extends FragmentActivity {静态最终 int NUM_ITEMS = 10;MyAdapter mAdapter;ViewPager mPager;@覆盖protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mAdapter = new MyAdapter(getSupportFragmentManager());Log.i("Pager", "mAdapter = " + mAdapter.toString());mPager = (ViewPager)findViewById(R.id.pager);如果(mPager == null)Log.i("Pager", "mPager = null");别的Log.i("Pager", "mPager = " + mPager.toString());Log.i("寻呼机", "设置寻呼机适配器");mPager.setAdapter(mAdapter);}公共静态类 MyAdapter 扩展 FragmentPagerAdapter {公共 MyAdapter(FragmentManager fm) {超级(调频);Log.i("Pager", "MyAdapter 构造函数");}@覆盖公共 int getCount() {Log.i("Pager", "MyAdapter.getCount()");返回 NUM_ITEMS;}@覆盖公共片段 getItem(int position) {Log.i("Pager", "MyAdapter.getItem()");返回 TestFragment.newInstance(position);}}公共静态类 TestFragment 扩展 Fragment {公共静态 TestFragment newInstance(int position) {Log.i("Pager", "TestFragment.newInstance()");TestFragment 片段 = 新的 TestFragment();Bundle args = new Bundle();args.putInt("位置", 位置);fragment.setArguments(args);返回片段;}@覆盖公共视图 onCreateView(LayoutInflater inflater, ViewGroup 容器,捆绑savedInstanceState) {//TODO 自动生成的方法存根Log.i("Pager", "TestFragment.onCreateView()");LinearLayout layout = (LinearLayout)inflater.inflate(R.layout.fragment_item, null);int position = getArguments().getInt("position");TextView tv = (TextView)layout.findViewById(R.id.text);tv.setText("片段#" + 位置);tv.setTextColor(Color.WHITE);tv.setTextSize(30);返回布局;}}

}

ma​​in.xml

fragment_item.xml

我的问题是,不是每次用户左右滑动时都创建一个新的 Fragment 实例,我该如何保存片段的状态(到某些数据结构)然后恢复它?

API 演示 似乎根本没有任何状态信息保存代码.

解决方案

FragmentActivity

中使用ViewPager.setOffscreenPageLimit()

ViewPager pager = (ViewPager) findViewById(R.id.viewPager);pager.setOffscreenPageLimit(2);

如何查看更多信息我应该告诉我的自定义 FragmentPagerAdapter 停止销毁我的片段吗?

I tried out the sample code from the API and it didn't really work so I implemented my own:

FragmentPagerSupport

public class FragmentPagerSupport extends FragmentActivity {

static final int NUM_ITEMS = 10;
MyAdapter mAdapter;
ViewPager mPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mAdapter = new MyAdapter(getSupportFragmentManager());
    Log.i("Pager", "mAdapter = " + mAdapter.toString());

    mPager = (ViewPager)findViewById(R.id.pager);
    if (mPager == null)
        Log.i("Pager", "mPager = null");
    else 
        Log.i("Pager", "mPager = " + mPager.toString());

    Log.i("Pager", "Setting Pager Adapter");
    mPager.setAdapter(mAdapter);
}

public static class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
        Log.i("Pager", "MyAdapter constructor");
    }

    @Override
    public int getCount() {
        Log.i("Pager", "MyAdapter.getCount()");
        return NUM_ITEMS;            
    }

    @Override
    public Fragment getItem(int position) {
        Log.i("Pager", "MyAdapter.getItem()");

        return TestFragment.newInstance(position);
    }
}

public static class TestFragment extends Fragment {

    public static TestFragment newInstance(int position) {
        Log.i("Pager", "TestFragment.newInstance()");

        TestFragment fragment = new TestFragment();

        Bundle args = new Bundle();
        args.putInt("position", position);
        fragment.setArguments(args);

        return fragment;
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        Log.i("Pager", "TestFragment.onCreateView()");

        LinearLayout layout = (LinearLayout)inflater.inflate(R.layout.fragment_item, null);
        int position = getArguments().getInt("position");

        TextView tv = (TextView)layout.findViewById(R.id.text);
        tv.setText("Fragment # " + position);
        tv.setTextColor(Color.WHITE);
        tv.setTextSize(30);

        return layout;
    }

}

}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />
</LinearLayout>

fragment_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView  
    android:id="@+id/text"
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:gravity="center" 
    android:text="@string/hello"
    />
</LinearLayout>

My question is, instead of creating a new Fragment instance each time the user swipes left and right, how do I save a fragment's state (to some data structure) and then restore it?

The API demo doesn't seem to have any state information saving code at all.

解决方案

Use ViewPager.setOffscreenPageLimit() in FragmentActivity

ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
pager.setOffscreenPageLimit(2);

See more at How do I tell my custom FragmentPagerAdapter to stop destroying my fragments?

这篇关于在 ViewPager 中保存 Fragment 状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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