我有一个Live Android应用程序,从市场我收到了以下堆栈跟踪,我不知道为什么它发生在应用程序代码中没有发生,但它是由应用程序中的一些或其他事件引起的(假设)
我没有使用Fragments,仍然有FragmentManager的引用.如果任何机构可以对某些隐藏的事实进行一些说明以避免此类问题:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyDown(Activity.java:1962)
at android.view.KeyEvent.dispatch(KeyEvent.java:2482)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1720)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1258)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2851)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2824)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2011)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud) 我正在使用Android兼容性库来实现片段并扩展了布局示例,以便片段包含一个触发另一个片段的按钮.
在左侧的选择窗格中,我有5个可选项 - A B C D E
.
每个都FragmentTransaction:replace
在详细信息窗格中加载一个片段(via ) -a b c d e
现在我扩展了片段e
以包含一个按钮,该按钮e1
还会在详细信息窗格中加载另一个片段.我在片段e
的onClick方法上做了这个,如下所示:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
如果我做出以下选择:
E - e - e1 - D - E
Run Code Online (Sandbox Code Playgroud)
然后片段e
在详细信息窗格中.这很好,我想要的.但是,如果我back
在此时按下按钮它什么都不做.我必须点击两次,因为e1
它仍然在堆栈上.点击后我在onCreateView中得到一个空指针异常:
为了"解决"这个问题,无论何时A B C D E
选择,我都添加了以下内容:
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
Run Code Online (Sandbox Code Playgroud)
只是想知道这是否是正确的解决方案或我是否应该做一些不同的事情?
有些用户报告,如果他们使用通知栏中的快速操作,他们就会收到一个强制关闭.
我在通知中显示了一个快速操作,它调用了"TestDialog"类.在按下"贪睡"按钮后的TestDialog类中,我将显示SnoozeDialog.
private View.OnClickListener btnSnoozeOnClick() {
return new View.OnClickListener() {
public void onClick(View v) {
showSnoozeDialog();
}
};
}
private void showSnoozeDialog() {
FragmentManager fm = getSupportFragmentManager();
SnoozeDialog snoozeDialog = new SnoozeDialog();
snoozeDialog.show(fm, "snooze_dialog");
}
Run Code Online (Sandbox Code Playgroud)
错误是 *IllegalStateException: Can not perform this action after onSaveInstanceState*.
IllegarStateException被触发的代码行是:
snoozeDialog.show(fm, "snooze_dialog");
Run Code Online (Sandbox Code Playgroud)
该类正在扩展"FragmentActivity",而"SnoozeDialog"类正在扩展"DialogFragment".
以下是错误的完整堆栈跟踪:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:127)
at com.test.testing.TestDialog.f(TestDialog.java:538)
at com.test.testing.TestDialog.e(TestDialog.java:524)
at com.test.testing.TestDialog.d(TestDialog.java:519)
at com.test.testing.g.onClick(TestDialog.java:648)
at android.view.View.performClick(View.java:3620)
at …
Run Code Online (Sandbox Code Playgroud) 我开始使用DialogFragment,因为他们通过方向更改和其他东西很好地工作.但是我遇到了令人讨厌的问题.
我有AsyncTask
显示进度DialogFragment并解散它onPostExecute
.一切正常,除非在onPostExecute
应用程序处于后台时发生(例如,在按下Home按钮后).然后我在DialogFragment解雇时得到了这个错误 - " Can not perform this action after onSaveInstanceState
".卫生署.常规对话框工作得很好.但不是FragmentDialog.
所以我想知道,在应用程序处于后台时,解雇DialogFragment的正确方法是什么?我没有真正使用Fragments,所以我认为我只是遗漏了一些东西.
android android-fragments android-dialog android-dialogfragment
FATAL EXCEPTION: main
Process: com.example.loan, PID: 24169
java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form}
at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533)
at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5068)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
所以,我有一个使用tabhost构建的Android应用程序.共有三个选项卡,在tab2中,有一个按钮用于在tab2中进行片段事务(在片段活动中调用该函数)
FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.realtabcontent, mFrag);
t.addToBackStack(null);
t.commit();
Run Code Online (Sandbox Code Playgroud)
如果我像这样运行有例外:
如何解决?谢谢你的帮助
tabs android android-lifecycle android-fragments fragment-tab-host
我的Android应用由三个片段:A,B和C.它们被加载到MainActivity
布局中定义的两个容器中.
当应用程序启动时,它会显示在left_container中加载的fragmentA和在right_container中加载的fragmentC.
如果按在按钮fragmentA,一个FragmentTransaction
改变FragmentC通过FragmentB.
一切都好.但是当我尝试使用加载的fragmentB的引用时出现问题 findFragmentByTag()
,因为它返回null
.我已经使用了方法替换,FragmentTransaction
并且我已经完成了它commit()
,但是没有办法调用FragmentB方法.我的代码:
MainActivity.java:
public class MainActivity extends Activity{
static String fragmentTag = "FRAGMENTB_TAG";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Adds the left container's fragment
getFragmentManager().beginTransaction().add(R.id.left_container, new FragmentA()).commit(); //Adds the fragment A to the left container
//Adds the right container's fragment
getFragmentManager().beginTransaction().add(R.id.right_container, new FragmentC()).commit(); //Adds the Fragment C …
Run Code Online (Sandbox Code Playgroud) 我的应用程序在一些用户设备上连续崩溃,但在Activity onStart方法中存在以下异常:
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:123)
Run Code Online (Sandbox Code Playgroud)
我无法在我的模拟器中本地重现此错误.我在stackoverflow上找到了一些关于这个问题的问题: 这里和 这里
我已经尝试了建议的解决方案,即不允许onSaveInstance中的空包在片段或活动中.
但问题仍然存在.这是我遇到的唯一一个Crash报告,我不断得到它.
有没有人有工作的解决方案?
我想在网络后台操作后提交一个片段.我在成功进行网络操作后调用了commit(),但是如果活动进入暂停或停止状态,则崩溃应用程序说IllegalState异常.
所以我尝试使用commitAllowingStateLoss()并且它现在正常工作.
我浏览了一些博客和文章,它说commitAllowingStateLoss()不好用.
什么是在网络操作处理活动暂停和停止状态后处理提交片段的方法?
我试图取代fragment
的onActivityResult()
,但它总是给我的错误java.lang.illegalStateException.
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1377)
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1395)
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime: at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:637)
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime: at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:616)
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime: at .virtualClass.VirtualPurchaseFragment.dealWithSuccessfulPurchase(VirtualPurchaseFragment.java:161)
Run Code Online (Sandbox Code Playgroud)
这是我的onActivityResult
代码
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment fragment = new VirtualListFragment();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
}
Run Code Online (Sandbox Code Playgroud) 我正在处理的Android应用程序只有一个MainActivity,应用程序的每个屏幕都实现为Fragment.每个片段在MainActivity中实例化为私有类变量:
public class MainActivity extends Activity implements MainStateListener {
private FragmentManager fm = getFragmentManager();
private BrowseFragment browseFragment = BrowseFragment.newInstance();
...
Run Code Online (Sandbox Code Playgroud)
有一个"片段帧"可以加载每个屏幕片段.在应用程序中切换屏幕时,会调用此代码来加载片段:
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.frag_frame, incoming);
ft.addToBackStack(null);
ft.commit();
fm.executePendingTransactions();
Run Code Online (Sandbox Code Playgroud)
每个屏幕片段都有一个监听器,使片段能够调用MainActivity中的各种方法:
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mainStateListener = (MainStateListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement MainStateListener");
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是从MainActivity中退出的导航抽屉更新片段的一个方面.导航抽屉必须更新片段,并使用此代码执行此操作:
navigationDrawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
browseFragment.doSomethingOnBrowserFragment();
}
});
Run Code Online (Sandbox Code Playgroud)
在您更改方向之前,情况正常.然后当前屏幕片段加载正常(browseFragment).但是当你单击导航抽屉导致doSomethingOnBrowserFragment()方法执行时,由于mainStateListener对象本身(在browseFragment中附加)为null,我得到一个空指针异常.根据我对Fragment生命周期的了解,这个变量不应该为null,因为onAttach()方法首先执行任何操作并设置mainStateListener变量.此外,如果我在该browserFragment上有一个使用mainStateListener对象的按钮(在方向更改后),单击该按钮永远不会出现此空指针问题.
堆栈跟踪:
08-04 …
Run Code Online (Sandbox Code Playgroud)