我有一个托管三个Fragment
的活动,我可以使用Fragment
在BottomNavigationView
之间切换。我用来切换的机制Fragment
正在使用show
的{{1}}和hide
个函数,而不是FragmentTransaction
的{{1}}函数。我之所以这样做,是因为我希望只进行一次网络操作,并且只需要将replace
充气一次。
我使用此机制遇到的问题是,当我从FragmentTransaction
中的任何一个开始另一个Layout
,然后点击后退按钮Activity
和Fragment
的selectedItem时{1}}显示不匹配。
我能够解决这个问题,但我觉得效率较低。程序是每当我在切换BottomNavigationView
时点击Fragment
中的标签时,我给它一些预定的数字并保存在静态变量(BottomNavigation
)中,每当我点击时托管活动的Fragment
方法中的后退按钮我使用X
创建了一个switch-case块,以便在开始新Activity之前知道哪个OnResume()
可见,然后最终生成三个{{1}显示和隐藏所需的X
&#39>。
Fragment
我觉得使用三个FragmentTransaction
是昂贵的,我正在寻找一些有效的方法。如果你知道,你能告诉我一个吗?
Fragment
答案 0 :(得分:1)
关于您的代码的第一个注释:避免使用样板!只写一种方法而不是三种方法,并使用handleFragmentVisibility(String show, String hide1, String hide2, int container)
类型的签名。如果要显示的片段是null
,请通过测试show
来实例化它,例如:
Fragment newFragment = (show == "home") ? new HomeFragment() : (show == "dashboard") ? new DashboardFragment() : new NotificationFragment();
但是,您的所有片段都不应该null
通过隐藏(请自行检查),因为您没有remove
来自您的活动,或replace
它们与其他片段。您可以使用show
和hide
,而不是使用attach
和detach
,这两套方法都会保持状态。我没有看到效率问题,你确实需要调用三个FragmentTransaction
。它只能用更少的代码完成:
public void handleFragmentVisibility(String show, String hide1, String hide2){
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag(show)).commit();
fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag(hide1)).commit();
fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag(hide2)).commit();
}
请注意,尽管此方法在隐藏或分离片段时保持片段的状态,但其他事件(如方向更改)仍然需要您在onSaveInstanceState(Bundle savedInstanceState)
中处理保存状态。