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