为什么不保留所有TextView及其状态?

时间:2014-09-09 23:44:24

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

我还是Android(和编码)的新手,这是我第一次使用Swipe视图,即ViewPagers和适配器。我的活动有3个片段。当我从片段A移动到片段B时,一切都很好。但是当我移动到片段C时,onStop被调用片段A.当我返回片段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;
    }

}

以下是一些表现不佳的TextView

<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" />  

编辑:顺便说一句,我和FragmentPagerAdapterFragmentStatePagerAdapter都玩过。我不完全明白他们做的不同,但似乎都没有给我我想要的东西。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

与活动类似,您需要在onSaveInstanceState()中手动保存状态并稍后恢复状态。