ProgressBar setProgress() 在 Activity recreate() 后不工作

ProgressBar setProgress() not working after Activity recreate()

我有一个水平的 ProgressBar 显示游戏中的剩余生命。当生命为 0(ProgressBar 进度为 0)时游戏结束并且有一个按钮 RESTART 调用 activity.recreate();。重新创建时必须再次显示进度,但显示为空(进度 0)。

一切正常,并且正在正确重新创建,但 ProgressBar。 onCreate() 方法有这样几行:

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

重新创建 activity 时,将再次调用这些行。即使设置断点,我也可以看到进度为 4,但是 ProgressBar 显示为空,与重新创建 activity.

之前相同

我尝试了 invalidate、postinvalidate 等……没用。

如何解决?

像这样重新创建您的 activity 对您有用。

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

来自 recreate 文档:

public void recreate ()

Cause this Activity to be recreated with a new instance. This results in essentially the same flow as when the Activity is created due to a configuration change -- the current instance will go through its lifecycle to onDestroy() and a new instance then created after it.

以下是 activity 重新创建 activity 时的生命周期:

onSaveInstanceState() // 生命进度条保存当前进度(你的情况是0)
onDestroy()
onCreate() // 你填满生命进度条
onRestoreInstanceState() // [重要] Activity 恢复之前的状态并将生命进度条的进度设置为 0.

这是 Android 的预期行为,如果您需要在 activity 重新创建后填充完整的生命进度条,则需要在 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();
}