繁体   English   中英

处理 Fragment 内 View(State)PagerAdapter 内 Fragment 的屏幕旋转

[英]Handling Screen Rotation for Fragment inside of View(State)PagerAdapter inside Fragment

你好(安卓)程序员,

情况如下:

我有一个使用 NavigationDrawer 的活动,它允许加载 3 个片段。 在其中一个片段中,我有一个 ViewStatePagerAdapter,它轮流承载 3 个片段。 在其中一个片段中,我使用游标加载器加载了一堆数据库数据。 这些值可编辑为新值,但在单击某个按钮之前不应将这些值保留到数据库中。

所有这些工作正常,但问题是当我现在旋转屏幕时,所有更改的数据都消失了。 我尝试在内部片段本身中使用 onSaveInstance,但我认为问题更高,正如我已经注意到的,当我旋转屏幕时,viewpager 跳回第一个选项卡。

什么是正确的方法(/正确的位置:活动,某些片段,...):

  1. 确保 viewpager 保留在右侧选项卡上
  2. 记住内部片段中发生变化的数据

包含 viewpager 的片段当前具有以下 onCreateView :

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v =  inflater.inflate(R.layout.fragment_home, null);
    tabLayout = (TabLayout) v.findViewById(R.id.fragment_tabs);
    viewPager = (ViewPager) v.findViewById(R.id.fragment_viewpager);
    viewPager.setOffscreenPageLimit(3);

    viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
    tabLayout.setupWithViewPager(viewPager);

    return v;
}

和 FragmentStatePagerAdapter 的内部类

 class MyAdapter extends FragmentStatePagerAdapter {

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

    /**
     * Return fragment with respect to Position .
     */
    @Override
    public Fragment getItem(int position)
    {
        switch (position){
            case 0 : return PersonFragment.newInstance();
            case 1 : return FriendsFragment.newInstance();
            case 2 : return EventsFragment.newInstance();
        }
        return null;
    }

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

    /**
     * This method returns the title of the tab according to the position.
     */
    @Override
    public CharSequence getPageTitle(int position) {

        switch (position){
            case 0 :
                return "ME";
            case 1 :
                return "FOLLOWING";
            case 2 :
                return "EVENTS";
        }
        return null;
    }
}

这里的其他人没有什么特别的事情发生。 (哪个可能应该?)

viewpager 里面的片段有以下 onCreate/onCreateView

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_person, container, false);
    this.viewHolder = new ViewHolder(rootView);

    if (savedInstanceState != null) {
        CharSequence savedPersonName = savedInstanceState.getCharSequence("personName");
        if (savedPersonName != null) {
            Log.v("PersonFragment", savedPersonName.toString());
            this.viewHolder.personnameView.setText(savedPersonName);
        }
    }

    return rootView;
}

提前致谢。

您可能已经知道这一点,但这是我为解决您的第二个问题而要做的事情

private TextView tvTitle;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.mylayout, container, false);

    tvTitle = (TextView) rootView.findViewById(R.id.mytitle);

    if (savedInstanceState != null) {
      CharSequence csTitle = savedInstanceState.getCharSequence("myTitle");
      if (csTitle != null) tvTitle.setText(csTitle);
    }
}

public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

outState.putCharSequence("myTitle", tvTitle.getText());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM