1. 问题说明
安卓页面翻转之后,Activity实例会被系统消灭然后重新创建,这样就会导致在页面翻转之前所作的操作全部丢失,然后页面内容置回初始的样子,这样会给用户带来非常糟糕的体验。栗子我就不演示了,我想大概大家已经碰到了。
2. 解决办法
可以通过重写onSaveInstanceState()方法,将需要保存的数据存放在Bundle对象中,利用Bundle.putString(“key”,data)的方式存放,然后在onCreate()方法中通过Bundle.getString(“key”,defaultValue);的方法将值取出,进行页面UI渲染。具体的栗子如下:
注:代码中有关日志的使用若不熟练可参考此链接
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private final static String TAG = "MainActivityLog";
private String changeData = "初始数据";
private Button mButton;
private TextView mTextView;
private void init(){
mButton = findViewById(R.id.myButton);
mTextView = findViewById(R.id.myText);
mTextView.setText(changeData);
Log.d(TAG,"初始化数据:"+mTextView.getText().toString());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
if (savedInstanceState != null){//是否是第一次加载
//拿回数据
changeData = savedInstanceState.getString("changeData");
Log.d(TAG,"获取的数据:"+changeData);
mTextView.setText(changeData);
}
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
changeData = "改变后的数据";
mTextView.setText(changeData);
Log.d(TAG,"改变后的数据:"+mTextView.getText().toString());
}
});
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
//存放数据
savedInstanceState.putString("changeData",changeData);
}
}
日志输出
3. 简要说明
onSaveInstanceState()方法通常由系统在onStop()方法之前调用,可以保存基本类型的数据和实现Serializable或Parcelable接口的对象。但是如果是用户点击了返回键,虽然Activity经历的生命周期和屏幕旋转相同,但是系统会理解成,你已经放弃这些数据了,所以此时onSaveInstanceState()方法也回天无术了