Activity recreate()

时间:2019-09-28 09:35:27

标签: android android-layout progress-bar activity-lifecycle recreate

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

除了ProgressBar以外,其他所有工具都工作正常并且可以正确地重新创建。 onCreate()方法具有以下几行:

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

重新创建活动时,将再次调用这些行。即使放置断点,我也可以看到进度为4,,但是ProgressBar显示为空,与重新创建活动之前一样。

我尝试了无效,后无效等...不起作用。

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

摘自recreate文档:

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();
}

答案 1 :(得分:0)

像这样重新创建活动将对您有用。

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