android fragment 切换保存状态,Android Activity Fragment 状态保存

Android Activity Fragment 状态保存

首先查阅这几篇文章,了解acticity和fragment的保存过程。

附带activity和fragment的生命周期图,看后应该比较容易理解。

c268300749ef

activity_lifecycle.png

c268300749ef

pic

看完后基本了解原理了,这里要将要点总结一下:

1.Back stack中的fragment,只是View的销毁和重建, 其本身并没有被重建,并且成员变量也没有被清除,所以这种情况不用做任何保存操作系统自动保存,当然listview和recycleview的数据需重新设置回去,setAdapter,也是下面的第3点

2.fragment + viewpage 时注意使用FragmentPagerAdapter 和 FragmentStatePagerAdapter 这个两个函数的不同

3.在使用fragment+recycleview或activity+recycleview时如何恢复原来状态和数据,其实也不是那么复杂,recycleview的位置系统将自动保存,你只需重新设置adapter的数据即可,注意:如果是fragment一定要在onCreateView()函数恢复,而且要在view组件完成Listener后恢复;如果是activiy则在onRestoreInstanceState(),同样要在view组件完成Listener后恢复;

recycleview能自动保存状态是因为实现了以下方法(系统自带),第三方view必须实现以下方法才能让系统正确保存状态

 
 

public class CustomView extends View {

...

@Override

public Parcelable onSaveInstanceState() {

Bundle bundle = new Bundle();

// Save current View's state here

return bundle;

}

@Override

public void onRestoreInstanceState(Parcelable state) {

super.onRestoreInstanceState(state);

// Restore View's state here

}

...

}

Activity恢复状态情况:

 
 

public class MainActivity extends AppCompatActivity {

// These variable are destroyed along with Activity

private int someVarA;

private String someVarB;

...

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putInt("someVarA", someVarA);

outState.putString("someVarB", someVarB);

}

@Override

protected void onRestoreInstanceState(Bundle savedInstanceState) {

super.onRestoreInstanceState(savedInstanceState);

someVarA = savedInstanceState.getInt("someVarA");

someVarB = savedInstanceState.getString("someVarB");

}

...

}

Fragment恢复状态情况:

 
 

public class MainFragment extends Fragment {

// These variable are destroyed along with Activity

private int someVarA;

private String someVarB;

...

@Override

public void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putInt("someVarA", someVarA);

outState.putString("someVarB", someVarB);

}

@Override

public void onActivityCreated(@Nullable Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

someVarA = savedInstanceState.getInt("someVarA");

someVarB = savedInstanceState.getString("someVarB");

}

...

}

保存服务器加载的数据:

 
 

public class MainFragment extends Fragment {

...

private String dataGotFromServer;

@Override

public void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putString("dataGotFromServer", dataGotFromServer);

}

@Override

public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

dataGotFromServer = savedInstanceState.getString("dataGotFromServer");

}

...

}

3.在activity和fragment的生命周期函数中的onSaveInstanceState()不是每次新建或重建都会运行,只有在系统将它销毁或关闭屏幕时才会运行,在activity中的onRestoreInstanceState()只有重建才运行

4.组件必须设置id属性,如EditText 或者 TextView,只要设置了 android:freezeText="true",其他组建有id就行

所以请不要在Fragment或activity的 onSaveInstanceState 方法中保存 View 状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值