我有 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();
}
我不太确定为什么隐藏和显示似乎不起作用 - 因为每当我第一次尝试单击以加载片段时它被正确加载,但是一旦我尝试单击已经加载的片段, 它只是没有改变。 我还尝试将隐藏和加载/显示功能分成两个不同的功能 - 但没有用。任何帮助将不胜感激:)
我发现了问题 - 而不是做
.hide(getFragment(currentFragment))
我应该做的
.hide(getSupportFragmentManager().findFragmentByTag(currentFragment))
因为我想隐藏当前加载到容器中的片段 - 而不是新片段(getFragment 为我返回一个新片段)。