我知道这个问题被问了很多次,但我已经尝试了所有得到回答的问题 喜欢
getSupportFragmentManager().executePendingTransactions();
使用fragmentTransaction.replace
我的问题是当我使用findFragmentByTag时,它在一个地方工作而在其他地方不起作用。
我没有得到我做错的地方因为findFragmentByTag在R.id.action_clean案例中返回片段但在R.id.action_cart案例中不起作用。
我的代码是
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id){
case R.id.action_cart: // don't work in this case
if (Cart.getProductCount(this) > 0) {
if (getSupportFragmentManager().findFragmentByTag(CartFragment.class.getName()) != null) {
if (getSupportFragmentManager().findFragmentByTag(CartFragment.class.getName()).isVisible()) {
Log.v("visible","visible");
}
Log.v("visible2","not null");
Toast.makeText(this, "Cart is not empty", Toast.LENGTH_SHORT).show();
}
else{
changeFragment(new CartFragment());
}
}else{
Toast.makeText(this,"Cart is empty",Toast.LENGTH_SHORT).show();
}
break;
case R.id.action_login:
changeFragment(new LoginFragment());
// Toast.makeText(this,"login",Toast.LENGTH_SHORT).show();
break;
case R.id.action_signup:
changeFragment(new UserDetailFragment());
//Toast.makeText(this,"sign up",Toast.LENGTH_SHORT).show();
break;
case R.id.action_clean: // work here
if(Cart.clearCart(this)){
Toast.makeText(this,"All items has been removed from Cart",Toast.LENGTH_SHORT).show();
updateCartCount();
if (getSupportFragmentManager().findFragmentByTag(CartFragment.class.getName()) != null
&& getSupportFragmentManager().findFragmentByTag(CartFragment.class.getName()).isVisible()) {
removeFragment(getSupportFragmentManager().findFragmentByTag(CartFragment.class.getName()));
}
}else Toast.makeText(this,"Cart can not be cleaned",Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
这是changeFragment
@Override
public void changeFragment(Fragment fragment, CustomDictionary... dictionary) {
FragmentTransaction ft= getSupportFragmentManager().beginTransaction();
Bundle bundle = new Bundle();
if (dictionary != null && dictionary.length > 0) {
for (CustomDictionary dic : dictionary) {
bundle.putString(dic.getKey(),dic.getValue());
}
}
fragment.setArguments(bundle);
ft.setCustomAnimations(R.anim.enter, R.anim.exit);
ft.replace(R.id.fragmentContainer, fragment,fragment.getClass().getName()) // tag
.addToBackStack(fragment.getClass().getName())
.commit();
getSupportFragmentManager().executePendingTransactions();
}
removeFragment()
@Override
public void removeFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().remove(fragment)
.commit();
fragmentManager.popBackStack();
}
答案 0 :(得分:0)
您为标签使用了不同的名称...... 您通过
分配了标签fragment.getClass().getSimpleName()
并通过
调用它CartFragment.class.getName()
因此,只需使用其中一个进行流程设置和按标记获取即可。 的 P.S。您在调用addToBackStack时设置标记!
-----更新:
我建议通过以下方式迭代你在backstack中拥有的所有片段:
for (Fragment fragment : getFragmentManager().getFragments()) {
try {
Log.v(TAG,"fragment:"+fragment.getTag()+", isVisible:"+fragment.isVisible());
} catch (NullPointerException e) {
}
}
然后很清楚,如果存在,片段的标记是什么:-) 从活动中调用时,使用 getSupportFragmentManager 而不是 getFragmentManager 。