我有一个LoginActivity
(用户登录)。 它基本上是自己的Activity
是主题就像一个对话框(看上去好像一个对话框)。 这似乎在SherlockFragmentActivity
。 我要的是:如果有一个成功登录,应该有两个FragmentTransaction
的更新视图。 下面是代码:
在LoginActivity
,如果登录成功,
setResult(1, new Intent());
在SherlockFragmentActivity
:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 1) {
LoggedStatus = PrefActivity.getUserLoggedInStatus(this);
FragmentTransaction t = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
SherlockListFragment mFrag = new MasterFragment();
t.replace(R.id.menu_frame, mFrag);
t.commit();
// Set up Main Screen
FragmentTransaction t2 = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
SherlockListFragment mainFrag = new FeaturedFragment();
t2.replace(R.id.main_frag, mainFrag);
t2.commit();
}
}
它崩溃的第一次提交,这个logcat的:
E/AndroidRuntime(32072): Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
E/AndroidRuntime(32072): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
E/AndroidRuntime(32072): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
E/AndroidRuntime(32072): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
E/AndroidRuntime(32072): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
E/AndroidRuntime(32072): at com.kickinglettuce.rate_this.MainFragmentActivity.onActivityResult(MainFragmentActivity.java:243)
E/AndroidRuntime(32072): at android.app.Activity.dispatchActivityResult(Activity.java:5293)
E/AndroidRuntime(32072): at android.app.ActivityThread.deliverResults(ActivityThread.java:3315)
首先,你应该读我的博客文章以了解更多信息(它谈论为什么这个发生异常时,你可以做些什么来防止它)。
调用commitAllowingStateLoss()
更是一个黑客不是修复。 国家的损失是坏的,应该不惜一切代价避免。 在那个时候onActivityResult()
被调用时,活动/片段的状态可能还没有得到恢复,因此在这个时候,发生的任何交易都将丢失作为一个结果。 这是必须解决的一个非常重要的bug! (请注意,错误只发生在你的Activity
是由系统......这,这取决于设备有多少内存,有时会出现罕见的已经被杀害后回来了......所以这类型的错误是不是一件很容易在测试赶上)。
尝试移动您的交易进入onPostResume()
代替(注意onPostResume()
后,总是叫onResume()
和onResume()
后,总是叫onActivityResult()
private boolean mReturningWithResult = false;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mReturningWithResult = true;
}
@Override
protected void onPostResume() {
super.onPostResume();
if (mReturningWithResult) {
// Commit your transactions here.
}
// Reset the boolean flag back to false for next time.
mReturningWithResult = false;
}
这似乎有点不可思议,但在做这样的事情是必要的,以确保您FragmentTransaction
后 s的始终致力于Activity
的状态已经恢复到原来的状态( onPostResume()
是保证后,被称为Activity
“ S状态已经恢复)。
这类似于@Alex洛克伍德答案,但使用Runnable
:
private Runnable mOnActivityResultTask;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mOnActivityResultTask = new Runnable() {
@Override
public void run() {
// Your code here
}
}
}
@Override
protected void onPostResume() {
super.onPostResume();
if (mOnActivityResultTask != null) {
mOnActivityResultTask.run();
mOnActivityResultTask = null;
}
}
如果你运行的是Android 3.0及以上lambda表达式 ,使用:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mOnActivityResultTask = () -> {
// Your code here
}
}
您可以使用ft.commitAllowingStateLoss()
来解决这个问题。
原因:你的ft.commit()
方法切换后onSaveInstanceState
。
您logcat的清清楚楚地写着:“后的onSaveInstanceState无法执行此操作” -你的Activity
已经在这一点上死了,也不会返回任何结果。
刚刚转会:
Intent in = new Intent();
setResult(1, in);
在你的地方Activity
的地方还活着,一切都会好起来的。 并且不要忘记finish()
的Activity
,提供的结果。
在我的情况我遇到因为以下的原因相同的问题
public void onBackPressed() {
super.onBackPressed();
setIntents();
}
private void setIntents(){
Intent searchConstaints=new Intent();
searchConstaints.putExtra("min",20);
searchConstaints.putExtra("max",80);
setResult(101,searchConstaints);
finish();
}
通过重新排列内onBackPressed的函数调用解决()
public void onBackPressed() {
setIntents();
super.onBackPressed();
}