处理隐藏和显示的片段on

时间:2017-11-13 15:39:38

标签: android android-fragments

我有一个托管三个Fragment的活动,我可以使用FragmentBottomNavigationView之间切换。我用来切换的机制Fragment正在使用show的{​​{1}}和hide个函数,而不是FragmentTransaction的{​​{1}}函数。我之所以这样做,是因为我希望只进行一次网络操作,并且只需要将replace充气一次。

我使用此机制遇到的问题是,当我从FragmentTransaction中的任何一个开始另一个Layout,然后点击后退按钮ActivityFragment的selectedItem时{1}}显示不匹配。

我能够解决这个问题,但我觉得效率较低。程序是每当我在切换BottomNavigationView时点击Fragment中的标签时,我给它一些预定的数字并保存在静态变量(BottomNavigation)中,每当我点击时托管活动的Fragment方法中的后退按钮我使用X创建了一个switch-case块,以便在开始新Activity之前知道哪个OnResume()可见,然后最终生成三个{{1}显示和隐藏所需的X&#39>。

Fragment

我觉得使用三个FragmentTransaction是昂贵的,我正在寻找一些有效的方法。如果你知道,你能告诉我一个吗?

Fragment

1 个答案:

答案 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它们与其他片段。您可以使用showhide,而不是使用attachdetach,这两套方法都会保持状态。我没有看到效率问题,你确实需要调用三个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)中处理保存状态。

相关问题