gpt4 book ai didi

android - getSupportFragmentManager() 导致 java.lang.IllegalStateException : Can not perform this action after onSaveInstanceState

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:21:41 25 4
gpt4 key购买 nike

我想弄清楚为什么:

getSupportFragmentManager().beginTransaction().commit();

失败,有

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

在一个非常基本的 FragmentActivity 类中。

这是我的用例(这将是一些伪代码而不是一个完整的例子,抱歉):我有一个带有内部 AsyncTask 类的 FragmentActivity。大致是这样的:

public class HelloWorld extends FragmentActivity {
showFragment(Fragment fragment, String name) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, fragment, name).commit();
}

private class SlowFragmentShow extends AsyncTask<Context, String, Void> {
protected Void doInBackground(Context... contexts) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
/* meh */
}
}

protected void onPostExecute(Void nothing) {
showFragment(new MyFragment(), "myFragment");
}
}
}

或者基本上,在启动应用程序 10 秒后,它会显示另一个 fragment 。听起来很简单,对吧?这似乎也很有效,直到我决定旋转手机。当我这样做时,应用程序会在调用“getSupportFragmentManager()...”并显示“无法执行此操作...”时崩溃。

最佳答案

经过多次调试,结果是当 SlowFragmentShow.onPostExecute() 被调用时,调用了 showFragment(),后者又调用了 getSupportFragmentManager( ),我收到了一个位于 IllegalState 中的 FragmentManager(因此可以说我得到的异常是正确的)。我仍然不确定为什么 getSupportFragmentManager() 会返回处于这种边缘状态的对象,但确实如此,我需要以某种方式访问​​“正确的”FragmentManager。因此,切入正题,我将 FragmentManager 作为静态变量存储在我的 HelloWorld FragmentActivity 中,我在 HelloWorld.onStart() 时更新了它被称为:

public class HelloWorld extends FragmentActivity {
private static FragmentManager fragmentManager;

public void onStart() {
fragmentManager = getSupportFragmentManager();
/* more code here */
}

showFragment(Fragment fragment, String name) {
fragmentManager.beginTransaction().replace(R.id.fragmentContainer, fragment, name).commit();
}

private class SlowFragmentShow extends AsyncTask<Context, String, Void> {
protected Void doInBackground(Context... contexts) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
/* meh */
}
}

protected void onPostExecute(Void nothing) {
showFragment(new MyFragment(), "myFragment");
}
}
}

好吧,这几乎解决了问题。现在我可以随心所欲地旋转手机,当 AsyncTask 完成时 fragment 仍会显示。

现在回想起来,确实有点“哦,当然!”,但 Android 背后的设计决策让人感觉相当“陌生”和不同寻常。我似乎以 try-catch(Exception) 结束了大约一半的代码,只是为了防止它因非 fatal error (例如未能更新文本字段)而崩溃,以及很多静态变量需要在 onStart() 上更新,因为这似乎是您引用 Android 对象而不让它们处于 IllegalState 中的唯一明智的方式。

关于android - getSupportFragmentManager() 导致 java.lang.IllegalStateException : Can not perform this action after onSaveInstanceState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17118383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com