- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想弄清楚为什么:
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/
为什么我收到一条错误消息,显示将 getSupportFragmentManager() 更改为 getFragmentManager() googleMap = ((SupportMapFragme
我在 fragment 内使用 map fragment 。但是在 getSupportFragmentManager() 上出现错误,即无法解析 getSupportFragmentManager(
我收到错误- "Can not resolve method getSupportFragmentManager()" 在下面的代码中。 对于 getSupportFragmentManager(),
我正在尝试按照此处 map API 上的教程来制作 Android 应用程序来学习 Java。在教程中,有一个在 Main Activity 中调用的辅助类 MapInitializer。函数 ini
在主要 Activity 中我有这个 public void showTimePickerDialog(View v) { DialogFragment newFragment = new u
我正在尝试将当前 fragment 的 Intent 添加到另一个 fragment 。为此,我在卡片中的 ImageButton 上添加了一个 OnclickListener。 但它不能正常工作,我
在我的应用程序中,我有两个 Activity ,它们都有一个静态方法。我从一个单独的 Activity 中调用这些方法。问题是在我的静态方法中我无法访问 getSupportFragmentManag
我有一个扩展 SherlockActivity 的主要 Activity 下面的代码似乎给我带来了麻烦 PopularFragment fragment = new PopularFragment()
点击抽屉导航项目后,我尝试使用 TabBar 和 View Pager 显示新 fragment 。 问题是新创建的 Fragment 导致 NULL 指针异常 viewPager.setAdapte
我收到以下错误:“方法 getSupportFragmentManager() 在我的 fragment 文件中未定义类型 new View.OnClickListener(){}”下面。 我有通过
我将 ViewPager 作为 RecyclerView 中的第一项。我想将 FragmentStatePagerAdapter 设置为 viewpager在 onBindViewHolder() 方
我想在我的 Android 应用程序中显示 Google map : public class DisplayMapActivity extends ActionBarActivity { p
设备进入待机状态后,如果我调用 getSupportFragmentManager(),我会得到一个 FragmentManager,其中包含未初始化的 fragment ,其所有变量都设置为 nul
这是我的 ItemAdapter 的代码,我以这种方式将其用作列表的适配器。 list.setAdapter(new ItemAdapter(thisContext,imageUrl)); 我正在尝试
这个问题在这里已经有了答案: What is difference between getSupportFragmentManager() and getChildFragmentManager()
我正在开发一个 android 应用程序,我想保存我在矢量 fragment 中的 fragment 。当我在 onSaveIstanceState 中使用 putFragment 时,系统抛出 Il
最近我在 android studios 中启动了一个新项目,并遇到了一个错误,我无法真正找到或看到问题所在,当我的应用程序遇到 getSupportFragmentManager() 行时,它崩溃了
我在 getSupportFragmentManager() 上遇到错误“此方法在 Fragment 中未定义”,同时创建带有滑动选项卡的 slider 菜单我准备了如下代码.. public cla
我正在使用 viewpager 并编译 API 23。我在我的代码中显示以下语句的编译错误,但该项目确实可以编译。 List fragments = getSupportFragmentManager
我正在使用 Android 编程中的教程编写我的第一个使用 fragment 的应用程序:Big Nerd Ranch 指南。 我创建了一个 fragment 和一个相应的布局,现在我想向将使用它的父
我是一名优秀的程序员,十分优秀!