【问题标题】:onActivityResult() fragment transaction erroronActivityResult() 片段事务错误
【发布时间】:2016-04-03 09:27:44
【问题描述】:

我正在尝试用onActivityResult() 替换fragment,但它总是给我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)

这是我的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();

}

【问题讨论】:

  • 尝试 transaction.commitAllowingStateLoss();
  • 我试过了,它不是替换片段,而是在那个地方显示空白片段
  • 你能查一下this,this,this
  • @pRaNaY 谢谢,我检查了所有这些链接,但commitAllowingStateLoss 只停止异常,不替换片段
  • 在使用 v4 Fragment 时需要使用getSupportFragmentManager() 而不是getFragmentManager()。检查here

标签: android android-fragments


【解决方案1】:

终于找到了解决办法,onActivityResult()中无法交换或替换fragment

我们需要将此代码放入HandlerOnResume()

解决方案:

private boolean change_fragment=false;

OnActivityResult() 代码

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    change_fragment=true;
}

OnResume() 代码

@Override
public void onResume() {
    super.onResume();
    if(change_fragment)
    {
        change_fragment=false;
        Fragment fragment = new VirtualListFragment();
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
    }
}

【讨论】:

  • 读者注意:您不应该在 onResume() 中提交片段事务。使用 onResumeFragments()(用于 FragmentActivity)或 onPostResume()(用于 Activity)方法可以避免“java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState”问题。感谢androiddesignpatterns.com/2013/08/…
  • 在我的情况下,处理程序或 onresume 都没有工作:-(
  • 正是我要找的!
【解决方案2】:

这个问题的答案是,您不应该在活动加载它的 savedInstanceState 之前或在它保存它的 savedInstanceState 之后对片段事务调用 commit。

此问题的现有答案之一提到 Activity#onResume() 作为提交片段事务的位置,但是 Activity#onPostResume() 将是一个更好的选择,因为它在活动的实例状态被保证为时调用恢复。

这篇博文很好地解释了正在发生的事情及其原因:http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

【讨论】:

    【解决方案3】:

    首先调用 super.onActivityResult 应该可以解决问题。

    试试下面的 sn-p:-

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if(requestCode == 1){
            if(resultCode == Activity.RESULT_OK){
                android.support.v4.app.FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.container, new DemoFragment(), "fsdf").commit();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-01
      • 1970-01-01
      • 2015-10-05
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多