有例外:片段已激活(Got exception: fragment already active)

2019-07-29 05:00发布

我有一个片段 ;

MyFragment myFrag = new MyFragment();

我把捆数据到这个片段:

Bundle bundle = new Bundle(); 
bundle.putString("TEST", "test");
myFrag.setArguments(bundle);

然后,我取代旧片段与这一个, 换上堆栈中

//replace old fragment
fragmentTransaction.replace(R.id.fragment_placeholder, myFrag, "MyTag");
//put on backstack
fragmentTransaction.addToBackStack(null);
//commit & get transaction ID
int transId = fragmentTransaction.commit();

后来,我弹出堆栈中与上述交易ID( transId ):

//pop the transaction from backstack
fragmentManager.popBackStack(transId,FragmentManager.POP_BACK_STACK_INCLUSIVE); 

后来,我又设定的批量数据作为参数传递给我的片段( myFrag ):

//Got Java.lang.IllegalStateException: fragment already active
myFrag.setArguments(bundle);

正如你看到的,我上面的代码有例外Java.lang.IllegalStateException: fragment already active我不明白为什么 myFrag 依然活跃,虽然我已经从堆栈中弹出它的交易。 ,总之,因为我得到了例外,我想我没有选择,只能去积极的片段,所以我所做的:

Fragment activeFragment = fragMgr.findFragmentByTag("MyTag");
fragmentTransaction.remove(activeFragment);

我不知道如果我的上述代码确实可以去积极的片段,因为我没有找到如何去主动的片段。 :(

在那之后,当我尝试捆绑数据设置为我的片段myFrag再次,我还是得到了同样的错误:

Java.lang.IllegalStateException: fragment already active

看来即使我删除片段,但仍处于活动状态, 为什么? 如何去积极的片段?

Answer 1:

读setArguments(捆绑参数)源将帮助您了解:

/**
* Supply the construction arguments for this fragment.  This can only
* be called before the fragment has been attached to its activity; that
* is, you should call it immediately after constructing the fragment.  The
* arguments supplied here will be retained across fragment destroy and
* creation.
*/
public void setArguments(Bundle args) {

    if (mIndex >= 0) {
        throw new IllegalStateException("Fragment already active");
    }
    mArguments = args;
}

不能使用setArguments(捆绑参数)上再次以相同的代码片段 。 你想要做我猜是创建一个新 片段 ,并重新设置参数。 或者你可以使用getArguments() ,然后使用put捆绑的方法来改变自己的价值观。



Answer 2:

尝试添加新的人之前删除以前的片段: https://stackoverflow.com/a/6266144/969325



Answer 3:

除去()改变的片段状态脱actiive。 在你的情况,你只是没有通话中移除后提交()(..)。

fragmentTransaction.remove(activeFragment);

删除后你会做的commit()(),太。

fragmentTransaction.remove(activeFragment).commit();


Answer 4:

有同样的问题。 我加入堆栈中的片段。 而错误是因为我没有叫popbackstack()。 使用popbackstack帮我



Answer 5:

我运行到上Xamarin.android同样的问题。 下面是对文件说。

之前该片段已被连接到它的活动这只能称为



Answer 6:

只需拨打从片段public方法

if(userFragment==null){
                    userFragment = new UserFragment();
                    Bundle bundle = new Bundle();
                    bundle.putString(Constants.EXTRA_CUSTOMER, result);
                    userFragment.setArguments(bundle);
                }else{
                    try {
                        Customer customer = new Customer();
                        customer.parseCustomer(new JSONObject(result));
                        userFragment.updateVeiw(customer);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }


Answer 7:

首先我先说明为什么发生这种情况,然后我就拿出我找到工作的解决方案...。

这个问题发生在Android正在移除从堆栈中的片段,但尚未与移除完毕。 为了检验这一点,你可以使用isRemoving()片段的方法。 如果false ,即片段不活跃,你可以设置使用参数去setArguments(bundle) 。 否则,你可以不设置参数已经激活的片段,只能通过解决相同的参数覆盖它getArguments().putAll(bundle)

总之,

    if (myFrag.isRemoving()) {
        myFrag.getArguments().putAll(bundle);
    } else {
        myFrag.setArguments(bundle);
    }

如果你想避免这种情况,即在一次所以没有活性片段删除片段,您可能需要使用onBackPressed()onBackStackChangedListener()这将设置isRemoving()false



Answer 8:

  1. 检查是否您的布局当前或旧的,例如

     setContentView(R.layout.activity_main); 
  2. 删除旧文件.gradle在您的项目文件并重建gradle这个文件的项目。



文章来源: Got exception: fragment already active