我有一个片段 ;
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
看来即使我删除片段,但仍处于活动状态, 为什么? 如何去积极的片段?
读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
捆绑的方法来改变自己的价值观。
尝试添加新的人之前删除以前的片段: https://stackoverflow.com/a/6266144/969325
除去()改变的片段状态脱actiive。 在你的情况,你只是没有通话中移除后提交()(..)。
fragmentTransaction.remove(activeFragment);
删除后你会做的commit()(),太。
fragmentTransaction.remove(activeFragment).commit();
有同样的问题。 我加入堆栈中的片段。 而错误是因为我没有叫popbackstack()。 使用popbackstack帮我
我运行到上Xamarin.android同样的问题。 下面是对文件说。
之前该片段已被连接到它的活动这只能称为
只需拨打从片段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();
}
}
首先我先说明为什么发生这种情况,然后我就拿出我找到工作的解决方案...。
这个问题发生在Android正在移除从堆栈中的片段,但尚未与移除完毕。 为了检验这一点,你可以使用isRemoving()
片段的方法。 如果false
,即片段不活跃,你可以设置使用参数去setArguments(bundle)
。 否则,你可以不设置参数已经激活的片段,只能通过解决相同的参数覆盖它getArguments().putAll(bundle)
。
总之,
if (myFrag.isRemoving()) {
myFrag.getArguments().putAll(bundle);
} else {
myFrag.setArguments(bundle);
}
如果你想避免这种情况,即在一次所以没有活性片段删除片段,您可能需要使用onBackPressed()
在onBackStackChangedListener()
这将设置isRemoving()
以false
。