[英]Instance state not restoring/saving correctly
當屏幕方向改變時,我試圖保存和恢復一個布爾字段。 無論出於何種原因,該字段在第一次方向更改期間都正確保存/恢復,但是當方向更改回初始狀態時,調用onSaveInstanceState()
時布爾值是錯誤的。
根據這個答案,我將android:configChanges="orientation"
添加到清單中相應的活動標簽。 以下代碼包含相關方法,為清晰起見進行了簡化:
public class SignatureActivity extends AppCompactActivity {
private boolean signaturePadIsEmpty = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String orientation = getResources().getConfiguration().orientation == ORIENTATION_PORTRAIT ? "portrait" : "landscape";
Log.d(TAG, "onCreate: Orientation is " + orientation + ", signaturePadIsEmpty = " + signaturePadIsEmpty);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
signaturePadIsEmpty = savedInstanceState.getBoolean("SignaturePadIsEmpty");
String orientation = getResources().getConfiguration().orientation == ORIENTATION_PORTRAIT ? "portrait" : "landscape";
Log.d(TAG, "onRestoreInstanceState: Orientation is " + orientation + ", signaturePadIsEmpty = " + signaturePadIsEmpty);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("SignaturePadIsEmpty", signaturePadIsEmpty);
String orientation = getResources().getConfiguration().orientation == ORIENTATION_PORTRAIT ? "portrait" : "landscape";
Log.d(TAG, "onSaveInstanceState: Orientation is " + orientation + ", signaturePadIsEmpty = " + signaturePadIsEmpty);
}
}
這是我開始活動並從縱向 -> 橫向然后從橫向 -> 縱向更改時的 Logcat 輸出:
06-27 11:50:08.037 32656-32656/com.example.www.debug D/SignatureActivity: onCreate: Orientation is portrait, signaturePadIsEmpty = true
06-27 11:50:12.405 32656-32656/com.example.www.debug D/SignatureActivity: onSaveInstanceState: Orientation is landscape, signaturePadIsEmpty = false
06-27 11:50:12.461 32656-32656/com.example.www.debug D/SignatureActivity: onCreate: Orientation is landscape, signaturePadIsEmpty = true
06-27 11:50:12.465 32656-32656/com.example.www.debug D/SignatureActivity: onRestoreInstanceState: Orientation is landscape, signaturePadIsEmpty = false
06-27 11:50:15.068 32656-32656/com.example.www.debug D/SignatureActivity: onSaveInstanceState: Orientation is portrait, signaturePadIsEmpty = true
06-27 11:50:15.131 32656-32656/com.example.www.debug D/SignatureActivity: onCreate: Orientation is portrait, signaturePadIsEmpty = true
06-27 11:50:15.133 32656-32656/com.example.www.debug D/SignatureActivity: onRestoreInstanceState: Orientation is portrait, signaturePadIsEmpty = true
編輯:問題原來是由我實現簽名板的事件處理程序引起的:
private void initializeLayoutElements(final int orientation) {
signaturePad = findViewById(R.id.signature_pad);
signaturePad.setOnSignedListener(new SignaturePad.OnSignedListener() {
@Override
public void onStartSigning() {
signaturePadIsEmpty = false;
}
@Override
public void onSigned() {
}
@Override
public void onClear() {
signaturePadIsEmpty = true;
}
});
}
所述onClear()
之后方法被調用onRestoreInstanceState()
並在標志設置為true
。 由於@SOreadytohelp 發布的解決方案回答了我最初的問題,因此我接受了他們的回答。
我在Github上創建了一個簡單的演示,向您展示如何存儲和恢復實例狀態,如果您理解它,請告訴我。 這是一個簡單的應用程序,有一個按鈕,當你按下按鈕時,你會改變布爾值的狀態,如果你旋轉屏幕,你仍然擁有與以前相同的值。 我希望是你正在尋找的。
他們的關鍵是在onRestoreInstanceState()
獲取Boolean
並在onSaveInstanceState()
保存Boolean
,你不需要這個android:configChanges="orientation
in the manifest.xml
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
signaturePadIsEmpty = savedInstanceState.getBoolean("SignaturePadIsEmpty");
tvState.setText(String.valueOf(signaturePadIsEmpty));
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("SignaturePadIsEmpty", signaturePadIsEmpty);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.