Android Show Hide Fragment BottomNavigationView首次添加的项目不可见

Android Show Hide Fragment BottomNavigationView首次添加的项目不可见,android,android-fragments,bottomnavigationview,Android,Android Fragments,Bottomnavigationview,我在主活动中设置了3个片段,希望使用BottomNavigationView对它们进行导航。我想添加它们一次,然后在它们之间切换,而不实际破坏片段。除了添加到SupportFragmentManager的第一个片段总是消失(尝试更改顺序,以便问题不在于片段本身)之外,一切正常。事实上,它并没有消失,但最后一个占据容器的碎片出现了。 我转到位置3,碎片3显示在容器中,然后单击位置1,碎片3仍将占据容器。但如果我点击位置2,就会出现碎片2。我如何添加片段: FragmentTransaction f

我在主活动中设置了3个片段,希望使用BottomNavigationView对它们进行导航。我想添加它们一次,然后在它们之间切换,而不实际破坏片段。除了添加到SupportFragmentManager的第一个片段总是消失(尝试更改顺序,以便问题不在于片段本身)之外,一切正常。事实上,它并没有消失,但最后一个占据容器的碎片出现了。 我转到位置3,碎片3显示在容器中,然后单击位置1,碎片3仍将占据容器。但如果我点击位置2,就会出现碎片2。我如何添加片段:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.container, fragment1); //whatever gets added here ends up being invisible
    ft.commitAllowingStateLoss();

    ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.container, fragment2);
    ft.commitAllowingStateLoss();

    ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.container, fragment3);
    ft.commitAllowingStateLoss();
如何使用OnNavigationItemSelectedListener在它们之间切换:

private BottomNavigationView.OnNavigationItemSelectedListener navigation_listener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment selectedFragment = null;
        Fragment previousFragment = getSupportFragmentManager().findFragmentById(R.id.container);

        switch(item.getItemId()){
            case R.id.bottom_navigation_bar_position1:
                selectedFragment = fragment1;
                break;
            case R.id.bottom_navigation_bar_position2:
                selectedFragment = fragment2;
                break;
            case R.id.bottom_navigation_bar_position3:                   
                selectedFragment = fragment3;
                break;
        }

        getSupportFragmentManager().beginTransaction().hide(previousFragment).commit();
        getSupportFragmentManager().beginTransaction().show(selectedFragment).commit();

        return true;
    }
};
XML菜单导航:

<item
    android:id="@+id/bottom_navigation_bar_position1"
    android:title="Title1"
    android:icon="@drawable/ic1"
    />

<item
    android:id="@+id/bottom_navigation_bar_position2"
    android:title="Title2"
    android:icon="@drawable/ic2"
    />

<item
    android:id="@+id/bottom_navigation_bar_position3"
    android:title="Title3"
    android:icon="@drawable/ic3"
    />


顺便说一句,使用replace()而不是show和hide可以工作,但这不是目标。。。 我还测试了第一个添加的片段是否存在(并且没有被销毁),它是否确实存在。。。
谢谢

您必须设置为
BottomNavigationView.OnNavigationItemSelectedListener选择的第0个位置项。查找
菜单
底部导航条位置1
我在代码中使用了这个,请根据您的需要进行重构

BottomNavigationView navigation = findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(this);
    Menu menu = navigation.getMenu();
    this.onNavigationItemSelected(menu.findItem(R.id.navigation_doc));

您必须为
BottomNavigationView.OnNavigationItemSelectedListener
设置所选的第0个位置项。查找
菜单
底部导航条位置1
我在代码中使用了这个,请根据您的需要进行重构

BottomNavigationView navigation = findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(this);
    Menu menu = navigation.getMenu();
    this.onNavigationItemSelected(menu.findItem(R.id.navigation_doc));

我没有试图显示和隐藏片段,而是通过使用ViewPager和SectionsPageAdapter管理片段来解决问题。将这两个链接起来后,使用ViewPager.setOffscreenPageLimit(3)确保没有碎片被破坏。我的BottomNavigationView.OnNavigationItemSelectedListener现在看起来像这样:

private BottomNavigationView.OnNavigationItemSelectedListener navigation_listener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        switch(item.getItemId()){
            case R.id.bottom_navigation_bar_position1:
                tab_view_pager.setCurrentItem(0);
                return true;
            case R.id.bottom_navigation_bar_position2:
                tab_view_pager.setCurrentItem(1);
                return true;
            case R.id.bottom_navigation_bar_position3:
                tab_view_pager.setCurrentItem(2);
                return true;
        }
        return false;
    }
};

我没有试图显示和隐藏片段,而是通过使用ViewPager和SectionsPageAdapter管理片段来解决问题。将这两个链接起来后,使用ViewPager.setOffscreenPageLimit(3)确保没有碎片被破坏。我的BottomNavigationView.OnNavigationItemSelectedListener现在看起来像这样:

private BottomNavigationView.OnNavigationItemSelectedListener navigation_listener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        switch(item.getItemId()){
            case R.id.bottom_navigation_bar_position1:
                tab_view_pager.setCurrentItem(0);
                return true;
            case R.id.bottom_navigation_bar_position2:
                tab_view_pager.setCurrentItem(1);
                return true;
            case R.id.bottom_navigation_bar_position3:
                tab_view_pager.setCurrentItem(2);
                return true;
        }
        return false;
    }
};

它导致onStart中的Fragment.setNextAnim(int)出现空指针异常。我用另一种方法解决了这个问题,但我怀疑如果你想采用这种方法,那么这就是正确的方向。谢谢你!它导致onStart中的Fragment.setNextAnim(int)出现空指针异常。我用另一种方法解决了这个问题,但我怀疑如果你想采用这种方法,那么这就是正确的方向。谢谢你!