ProgressBar setProgress () не работает после Activity воссоздать () - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть горизонтальная ProgressBar, которая отображает оставшуюся жизнь в игре.Когда жизнь равна 0 (ProgressBar прогресс равен 0), игра заканчивается, и появляется кнопка RESTART, которая вызывает activity.recreate();.При повторном создании прогресс должен быть снова показан полным, но он отображается пустым (прогресс 0).

Все работает нормально и воссоздается правильно, кроме ProgressBar.Метод onCreate () имеет следующие строки:

lifeProgressBar = findViewById(R.id.lifeProgressBar);
lifeProgressBar.setMax(4);
lifeProgressBar.setProgress(4);

При воссоздании действия эти строки вызываются снова.Даже устанавливая точку останова, я вижу, что прогресс равен 4, , но индикатор ProgressBar отображается пустым , так же, как и до воссоздания действия.

Я пробовал с invalidate, postinvalidate и т. Д... не сработало.

Как это решить?

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

С пересоздать документацию:

public void recreate ()

Заставить эту активность воссоздать новый экземпляр.Это приводит, по сути, к тому же потоку, что и при создании действия из-за изменения конфигурации - текущий экземпляр проходит свой жизненный цикл до onDestroy (), а затем создается новый экземпляр.

Вот жизненный цикл действия, когда действие было воссоздано:

onSaveInstanceState() // Сохранение текущего индикатора прогресса жизни (0 в вашем случае)
onDestroy()
onCreate() // Вы заполняетеиндикатор полной жизни
onRestoreInstanceState() // [ ВАЖНО ] Активность восстанавливает предыдущее состояние и устанавливает индикатор прогресса жизни на 0.

Это ожидаемое поведение Android, если вам нужно заполнить индикатор полной жизни после восстановления активности, то вам нужно сделать это в onRestoreInstanceState().

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lifeProgressBar = findViewById(R.id.lifeProgressBar);
    fillFullLifeProgressBar();
}

private void fillFullLifeProgressBar() {
    lifeProgressBar.setMax(4);
    lifeProgressBar.setProgress(4);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    // Fill full life progress bar here.
    fillFullLifeProgressBar();
}
0 голосов
/ 28 сентября 2019

Воссоздание вашей деятельности так будет работать для вас.

finish();
startActivity(getIntent());
overridePendingTransition(0, 0);
...