Java 处理视图内部碎片的屏幕旋转(状态)PagerAdapter inside Fragment

Java 处理视图内部碎片的屏幕旋转(状态)PagerAdapter inside Fragment,java,android,android-fragments,Java,Android,Android Fragments,你好,善良的(安卓)程序员 情况如下: 我有一个使用NavigationDrawer的活动,它允许加载3个片段。在其中一个片段中,我有一个ViewStatePagerAdapter,它在轮到它的时候承载了3个片段。在其中一个片段中,我使用游标加载程序加载了一组数据库数据。这些值可以编辑为新值,但在单击某个按钮之前不应保留到DB 所有这些都很好,但问题是当我现在旋转屏幕时,所有更改的数据都消失了。我尝试在内部片段本身中使用onSaveInstance,但我认为问题更严重,因为我已经注意到,与旋转屏

你好,善良的(安卓)程序员

情况如下:

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

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

正确的方法(/正确的位置:活动,特定片段,…)是什么:

  • 确保viewpager保持在右侧选项卡上
  • 记住内部片段中更改的数据
  • 包含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());
    }
    

    发布一些代码。您的viewpager在创建时做什么?是获取现有片段的实例,还是完全创建一个新片段。您的onCreate中为片段添加了什么。@QuantumTiger马上就来了,已经添加了一个部分,也添加了更多。您在哪里重新加载SavedInstanceState?我不再这样做了,因为它使应用程序像我那样崩溃了。这就是为什么我想知道我应该在哪里,怎样做。在viewpager片段中,我使用onSaveInstanceState将数据添加到outState捆绑包中,在onActivityCreated中,我检查它是否为null,如果不是,则从中获取数据。嗯,如果这样做,我的数据是否可能传递,但GUI只是不更新?因此我这样做了,甚至将值发送到logcat,正确的值显示在那里。在同一个if语句中,我使用setText,但在GUI中看不到它的变化。我更新了我在原始帖子中使用的onCreateView,所以你可以看到。所以看起来正在查看的片段与写入logcat的片段是不同的实例。上面阮的回答有用吗?我想我已经修复了它,不过我暂时删除了一些东西,所以一些bug可能会再次出现。似乎问题在于,在我的mainActivity中,我每次都创建一个新的HomeFragment,而不是首先检查是否存在一个(通过使用findFragmentByTag)。我想这也让它所有的孩子都消失了,包括ViewPager和其中的片段。谢谢你抽出时间来帮助我,非常感谢。很高兴你找到了它。整个片段,寻呼机的事情是相当糟糕的记录,伊姆霍伊试图找到一些关于它是如何工作的体面的文件,是的,没有多少成功。我想最好的方法是阅读它的源代码。。。