Состояние экземпляра не восстанавливается / сохраняется правильно - PullRequest
2 голосов
/ 27 июня 2019

Я пытаюсь сохранить и восстановить логическое поле при изменении ориентации экрана. По любой причине поле сохраняется / восстанавливается правильно во время первого изменения ориентации, но когда ориентация возвращается к исходному состоянию, значение логического значения неверно, когда вызывается 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, ответило на мой первоначальный вопрос, я принимаю их ответ.

1 Ответ

1 голос
/ 27 июня 2019

Я создал простую демонстрацию здесь на 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);
}
...