findFragmentByTag在某些地方的Activity中返回null

时间:2016-05-04 06:42:03

标签: android android-fragments

我知道这个问题被问了很多次,但我已经尝试了所有得到回答的问题 喜欢

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();
    }

1 个答案:

答案 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