实例状态 restoring/saving 不正确
Instance state not restoring/saving correctly
我正在尝试在屏幕方向更改时保存和恢复布尔字段。无论出于何种原因,在第一次方向更改期间字段 saving/restoring 是正确的,但是当方向变回初始状态时,调用 onSaveInstanceState()
时布尔值是错误的。
根据,我在清单中相应的activity标签中添加了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);
}
}
这是我启动 activity 并从纵向 -> 横向然后从横向 -> 纵向更改时的 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
在 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);
}
我正在尝试在屏幕方向更改时保存和恢复布尔字段。无论出于何种原因,在第一次方向更改期间字段 saving/restoring 是正确的,但是当方向变回初始状态时,调用 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);
}
}
这是我启动 activity 并从纵向 -> 横向然后从横向 -> 纵向更改时的 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
在 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);
}