实例状态 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="orientationmanifest.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);
}