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()方法也迴天無術了