片段显示和隐藏

问题描述 投票:0回答:1

我有 1 个主片段容器和 4 个片段,我希望通过底部导航栏在它们之间切换。 我不希望每次需要显示时都重新加载每个片段(使用替换方法)。 我尝试使用以下代码来加载一个片段,如果它以前没有加载过,或者如果它已经加载过则显示它(并隐藏前一个)。出于某种原因,隐藏和显示似乎不起作用。

       navigationView.setOnItemSelectedListener(item -> {

           int itemId = item.getItemId();

           Fragment fragment = getFragment(currentFragment);

           if (itemId == R.id.groupChatsIconItem) {
               if (fragment == null || fragment.getClass() != GroupChatFragment.class)
                   loadFragment(GROUP_CHAT_FRAGMENT);
           } else if (itemId == R.id.friendsIconItem) {
               if (fragment == null || fragment.getClass() != FriendsFragment.class)
                   loadFragment(FRIENDS_FRAGMENT);
           } else if (itemId == R.id.myProfileActivityIconItem) {
               if (fragment == null || fragment.getClass() != MyProfileFragment.class)
                   loadFragment(MY_PROFILE_FRAGMENT);
           } else if (itemId == R.id.directChatIconItem) {
               if (fragment == null || fragment.getClass() != DirectChatFragment.class)
                   loadFragment(DIRECT_CHAT_FRAGMENT);
           }
           return true;
       });

   }


public void loadFragment(String tag) {


       //if that's the first fragment - not adding to back stack to make sure the navigation view isn't being displayed alone.
       if (currentFragment == null) {
           currentFragment = tag;

           getSupportFragmentManager()
                   .beginTransaction()
                   .add(R.id.mainFragmentContainerView, getFragment(tag), tag)
                   .setReorderingAllowed(true)
                   .commit();
       }

       //The desired fragment isn't loaded yet.  loading it
       else if (getSupportFragmentManager().findFragmentByTag(tag) == null) {
           getSupportFragmentManager()
                   .beginTransaction()
                   .hide(getFragment(currentFragment))
                   .add(mainFragmentContainerView.getId(), getFragment(tag), tag)
                   .addToBackStack("yes")
                   .setReorderingAllowed(true)
                   .commit();
           currentFragment = tag;
       }
       //fragment was already loaded - hide the current one and show the new one
       else {
           Log.d("banana","desired fragment is already loaded");
           getSupportFragmentManager()
                   .beginTransaction()
                   .hide(getFragment(currentFragment))
                   .show(getFragment(tag))
                   .commit();
           currentFragment = tag;
       }
   }



private Fragment getFragment(String tag) {
       if (tag == null)
           return null;
       if (tag.equals(GROUP_CHAT_FRAGMENT))
           return new GroupChatFragment();
       if (tag.equals(FRIENDS_FRAGMENT))
           return new FriendsFragment();
       if (tag.equals(MY_PROFILE_FRAGMENT))
           return new MyProfileFragment();
       return new DirectChatFragment();
   }

我不太确定为什么隐藏和显示似乎不起作用 - 因为每当我第一次尝试单击以加载片段时它被正确加载,但是一旦我尝试单击已经加载的片段, 它只是没有改变。 我还尝试将隐藏和加载/显示功能分成两个不同的功能 - 但没有用。任何帮助将不胜感激:)

java android android-fragments
1个回答
0
投票

我发现了问题 - 而不是做

.hide(getFragment(currentFragment))
我应该做的
.hide(getSupportFragmentManager().findFragmentByTag(currentFragment))
因为我想隐藏当前加载到容器中的片段 - 而不是新片段(getFragment 为我返回一个新片段)。

© www.soinside.com 2019 - 2024. All rights reserved.