【问题标题】:Why aren't all TextViews and their states being retained?为什么不保留所有 TextView 及其状态?
【发布时间】:2014-09-09 23:44:24
【问题描述】:

我对 Android(和编码)还是新手,这是我第一次使用 Swipe 视图,即 ViewPagers 和适配器。我的活动有 3 个片段。当我从片段 A 移动到片段 B 时,一切都很好。但是当我移动到 Fragment C 时,onStop 被调用到 Fragment A。当我回到 Fragment A 时,我的所有视图都已恢复,除了少数几个。 EditText 的观点很好,但其他观点有问题......

  • 我有几个我启用/禁用的 TextView。这些状态不会保留。
  • 其他 TextView 可以是可见/不可见的。这些状态不会保留。
  • 我认为 TextView 文本也不会被保留。

我的印象是onSaveInstanceState 节省了浏览量。我必须手动保存这些状态吗?既然这些是Fragments,那应该通过arguments 来完成吗?

这是我的片段onCreateView

@Override
public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
    rootView = inflater.inflate(
            R.layout.activity_grade_calculator, container, false);
    Bundle args = getArguments();
    if(args.containsKey(PERSISTENT_FIRSTLOAD_BUNDLE_KEY)) {
        firstLoad = args.getBoolean(PERSISTENT_FIRSTLOAD_BUNDLE_KEY);
    }
    context = this.getActivity();

    if(firstLoad) {
        bindAll();
        setInitialViews();  
        setListeners();
    }
    firstLoad = false;
    return rootView;
}  

这里是MyPagerAdapter

@Override
public Fragment getItem(int i) {
    //System.out.println("We are trying to get item " + i);
    switch(i) {
        case 0:
            Fragment fragment = new FinalCalcFragment();
            return fragment;
        case 1:
            Fragment fragment1 = new NewGradeCalcFragment();
            return fragment1;
        case 2:
            Fragment fragment3 = new NewGradeCalcFragment();
            return fragment3;
        default:
            return null;
    }

}

这里有一些表现不佳的TextViews。

<TextView
                android:id="@+id/tv_grade_calc_forgrade"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/radioGroup1"
                android:layout_marginTop="4dp"
                android:text="@string/tv_grade_calc_forgrade" />

            <TextView
                android:id="@+id/tv_grade_calc_ifscore"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/radioGroup1"
                android:layout_marginTop="4dp"
                android:text="@string/tv_grade_calc_ifscore" />

             <TextView
                 android:id="@+id/tv_grade_calc_result"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_alignParentRight="true"
                 android:layout_below="@id/tv_grade_calc_ifscore"
                 android:layout_marginRight="10dp"
                 android:layout_marginTop="-7dp"
                 android:textSize="28sp" />  

编辑:顺便说一句,我玩过FragmentPagerAdapter 和FragmentStatePagerAdapter。我不完全理解他们的不同之处,但似乎都没有给我想要的。

【问题讨论】:

  • FragmentStatePagerAdapter 在您的情况下更可取,因为它可以保存您的 Fragments 的状态。
  • 谢谢,虽然它仍然没有像我想要的那样保存 TextViews。

标签: android android-layout android-fragments android-viewpager android-view


【解决方案1】:

如果您的ViewPager 中只有这三个Fragments,您可以使用mViewPager.setOffscreenPageLimit(value); 方法定义一个始终保存在内存中的Fragments 的最小数量 默认值为 1。这就是当您滑动到 Fragment C 时您的 Fragment A 状态丢失的原因。如果将此值增加到 2,则不会发生这种情况,因为 ViewPager 将始终保持两个 @ 的状态987654326@(提前或之前)您当前的显示Fragment。

【讨论】:

  • 嗯,做到了!谢谢!当我的片段停止时,我也会考虑手动保存这些,这样我就不会遇到任何问题。
【解决方案2】:

viewpager 只提前保留一页。当你到达片段 C 时,片段 A 被释放。

片段生命周期类似于活动生命周期,片段不再使用时可以停止。你应该为此做好准备。

和活动一样,需要手动将状态保存在onSaveInstanceState(),稍后再恢复状态。

【讨论】:

  • 这是否意味着——尽管EditTexts 保存了它们的状态——TextViews 不会被保留?对此有何规定?如果需要,我想我可以保存 TextView 状态。
  • 确实,您应该自己保持视图的状态(可见性/启用/等)并适当地恢复它(例如在onCreate 或onCreateView 中)。
  • EditText 已经本地保存了它的数据(请参阅stackoverflow.com/questions/24553634/…),但如果他们也保存了他们的可见性,我会感到惊讶。
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2021-09-30
  • 2012-12-20
  • 2019-05-24
  • 2012-06-29
  • 2016-09-03
  • 2021-09-11
相关资源
最近更新 更多