- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的项目上下文中,我在 Activity a
的 Fragment f(1)
中有一个 Button b
。
fragment f(x)
是 F
的一个实例,其中内容取决于参数 x
我需要用 b
点击事件上的实例 f(2)
替换当前实例 f(1)
:
来自 Activity a
:
private void setFragment(int x) {
Bundle args = new Bundle();
args.putInt("x", x);
F f = new F();
f.setArguments(args);
f.setListener(new F.Listener() {
public void onButtonClick(int x) {
setFragment(x);
}
});
getSupportFragmentManager()
.beginTransaction()
.replace(ID, f)
.commit();
}
来自 fragment f
:
b.setOnClickListener(new View.onClickListener() {
public void onClick(View view) {
listener.onButtonClick(x + 1);
}
});
我的问题是:
b
单击事件仅当发生配置状态更改时才会引发异常:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
请问,我的错误是什么?我读了很多关于这个异常的帖子,但我没有找到任何解决方案
编辑:我只是做了一个没有AsyncTask的测试,看代码:
尝试旋转屏幕并按下按钮
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
if (state == null) {
setFragment(1);
}
}
private void setFragment(int id) {
Bundle args = new Bundle();
args.putInt("id", id);
MyFragment myFragment = new MyFragment();
myFragment.setArguments(args);
myFragment.setListener(new MyFragment.Listener() {
@Override
public void onClick(int id) {
setFragment(id);
}
});
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment, myFragment)
.commit();
}
public static class MyFragment extends Fragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup view, Bundle state) {
return new Button(getActivity()) {
{
setText(String.valueOf(getArguments().getInt("id")));
setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(getArguments().getInt("id") + 1);
}
});
}
};
}
private static interface Listener {
public void onClick(int id);
}
private Listener listener;
public void setListener(Listener listener) {
this.listener = listener;
}
}
}
最佳答案
问题在于您设置监听器的方式。您正在设置监听器,然后将设备从横向旋转为纵向。旋转之后发生的事情是:
MainActivity
实例。FragmentManager
在内部创建一个新的 MyFragment
实例,并自动将其重新添加到 Activity 中,就像方向更改之前一样。所以不仅你有内存泄漏(旧的 Activity 不能被垃圾收集,因为它是从这里引用的)而且你也会得到这个错误。
正确做法:好吧,问题不仅在于 setRetainInstanceState()
您没有正确理解 Android Fragments 生命周期。如上所述,Fragments 由 FragmentManager (FragmentTransaction) 控制。所以,是的,每次你旋转屏幕时都会创建一个新的 Fragment 实例,但 FragmentManager 会自动为你附加它们(这有点奇怪,但这就是 Fragment 的工作原理)
我建议使用 EventBus
。该 fragment 将触发一个事件 onClick()
并且该 Activity 将在订阅后收到该事件。我推荐GreenDao EventBus .否则你可以看看 official docs ,但从我的角度来看,他们教的不是一个好的解决方案,因为您的 fragment 和 Activity 几乎没有连接(不是模块化)。他们说您应该使用 onAttach()
,就像您在文档示例中看到的那样:http://developer.android.com/guide/components/fragments.html#EventCallbacks
顺便说一句。如果您不使用 Fragment 参数来“传递”数据,也会出现类似的问题。有关详细信息,请阅读此博客:http://hannesdorfmann.com/android/fragmentargs/
关于android - "Can not perform this action after onSaveInstanceState" fragment 被替换时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28172091/
我是 Android 开发新手。我正在使用 onSaveInstanceState() 的覆盖版本来保存我自己的应用程序数据。我注意到我没有在我的函数中调用 super.onSaveInstanceS
如果我将在不调用 super.onSaveInstanceState(outState) 的情况下使用此代码; @Override protected void onSaveInstanceState
我在 fragment 兼容性包示例之后创建了一个 fragment 选项卡小部件,我在 onTabChanged 中更改了 fragment ,但我有一些市场报告在 onSaveInstanceSt
当我离开我的 Activity 时,为什么我的应用程序崩溃了?更具体地说:在我实现 onSaveInstanceState() 之前一切正常和 onRestoreInstanceState() 这是代
我有一个 Activity ,它启动结果代码的各种 Activity ,并在 onActivityResult 方法中获取结果时,它根据结果代码启动适当的 Activity 。 onSaveInsta
我在 onSaveInstanceState 上保存当前进度条时遇到问题。我保存当前正在进行的时间,但是当退出 Activity 并返回时恢复进度不显示剩余时间。 该类显示进度条 public cla
我想实现什么目标? 我想保存 x、y 和 score 的值,因此当用户旋转屏幕时,会检索这些值,而不是重获新生。 我有什么? 可能是正确的 onSaveInstanceState 代码,但由于某些 @
所以我了解了如何使用的主要想法 protected void onSaveInstanceState (Bundle outState) http://developer.android.com/
考虑以下代码,它将静态变量:mMyArray 保存在 onSaveInstanceState 中,并在 onRestoreInstanceState 中恢复它,但是我发现它根本无法保存 int 数组。
当我的应用程序变得复杂并且主要 Activity 开始在内存中保存大量数据(响应用户操作从文件加载和解析)时,我(错误地)从 onSaveInstanceState 切换到 onRetainNonCo
我是我应用的 onSaveInstanceState 实现。我已经成功实现了我的 onSaveInstanceState,但它不会在方向更改时保持当前问题。以下是我的 MainActivity。我一直
我正在尝试在单击后退按钮时保存和检索我的 Activity 的 onSaveInstanceState()。我读过默认情况下它不会保存,因为假设用户在单击返回时已完成 Activity 。但是,在我的
我已经阅读了android文档中的以下声明 Because onSaveInstanceState() is not guaranteed to be called, you should use i
我有几个扩展 LinearLayout 的自定义组件。 现在我想在屏幕方向改变时保存/恢复它们的状态,但我不能通过 Activity 的 onSaveInstanceState/onRestoreIn
我正在尝试了解生命周期方法和 onSaveInstanceState()。 我实际上只需要担心 onCreate() 和 onPause() 是否正确? onCreate()? 我可以/应该忽略 on
我是 Android 开发的新手,我有一个关于 onSaveInstanceState() 的问题。我目前正在处理一个应用程序的登录 Activity 。为了检查用户是否可以登录他们的帐户,我对服务器
我正在编写一个程序,我在同一个 Activity 中调用多个布局,但后来我注意到当我切换布局时,切换之前所做的更改不会恢复并且 onSavedInstanceState(Bundle outState
当 android 由于系统限制而杀死您的进程时,它使您能够通过将数据存储在一个包中来跨进程持久保存数据。如果您的进程被终止,这个包保存在哪里?它存在于哪个进程中?它住在内存中的什么地方?它存在于内核
我在我的 android Activity 中实现了 onSaveInstanceState 和 onRestoreInstanceState。 这些似乎工作正常,但我想在某些事情发生时(例如,当用户
我的问题似乎与其他人相反。 :) 每当我从一个 Activity 导航到下一个 Activity 时,都会调用我的 onSaveInstanceState。我检查了 LogCat,它绝对不会终止 Ac
我是一名优秀的程序员,十分优秀!