处理视图(状态)内碎片的屏幕旋转碎片

时间:2015-11-21 23:05:39

标签: java android android-fragments

Hello kind(android)程序员,

情况如下:

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

所有这一切都很好,但问题是,当我现在旋转屏幕时,所有更改的数据都消失了。我尝试在内部片段本身使用onSaveInstance,但我认为问题更高,正如我已经注意到的那样,当我旋转屏幕时,viewpager会跳回到第一个标签。

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

  1. 确保viewpager保留在右侧标签
  2. 记住内部片段中更改的数据
  3. 包含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;
    }
    

    提前致谢。

1 个答案:

答案 0 :(得分:1)

你可能已经知道了,但这是我要解决你的第二个问题

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());
}