当我完美地单击bottomNavigationView
时,如何使用bottomNavigationView
,但是当我按下后退按钮时,片段变成了先前的片段,而private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.nav_home:
selectedFragment = new HomeFragment();
break;
case R.id.nav_fav:
selectedFragment = new Fragment();
break;
case R.id.nav_search:
selectedFragment = new SearchFragment();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment).addToBackStack(null).commit();
return true;
}
};
的图标却没有改变
>car_df
Grade Speed Age
7 54 13
10 NA 4
NA 43 23
3 NA NA
1 87 12
NA NA NA
当我单击返回而不是图标时,这是更改片段,请帮助我
答案 0 :(得分:0)
回去时,尝试做一个 column "column1" is of type json but expression is of type text
performClick()
答案 1 :(得分:0)
我认为您可以这样设置所选项目
BottomNavigationView navView = findViewById(R.id.nav_view);
navView.setSelectedItemId(R.id.navigation_dashboard);
在按下后退按钮的情况下,您应该跟踪我认为用于切换的前一个按钮ID。我认为在viewpager中,有一个自动机制。
答案 2 :(得分:0)
对于具有 BpttomNavigation 和片段的页面,我建议使用 ViewPager
ViewPager 的优点:灵活性,可控制性,性能,更清晰的代码以及片段更改和手指滑动时的滑动动画效果很好。
为了获得您想要的结果,您可以使用类似以下的方法:
将您的ViewPager放在BpttomNavigation上方:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Doesn't need any addition -->
<android.support.v4.view.ViewPager
android:layout_above="@id/bottomNavigation"
android:layout_width="match_parent"
android:id="@+id/viewPager"
android:layout_height="match_parent"/>
<!-- Set up menu and stuff -->
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottomNavigation"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
创建您的ViewPagerFragmentAdapter:
public class ViewPagerFragmentAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments;
public ViewPagerFragmentAdapter(FragmentManager fragmentManager, ArrayList<Fragment> fragments) {
super(fragmentManager);
this.fragments = fragments;
}
//Returns fragment by position
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
//Returns fragment count
@Override
public int getCount() {
return fragments.size();
}
}
设置您的视图,片段和适配器:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Initialize views
final ViewPager viewPager = findViewById(R.id.viewPager);
final BottomNavigationView navigationView = findViewById(R.id.bottomNavigation);
//Initialize fragments list
ArrayList fragmentsArray = new ArrayList<Fragment>();
fragmentsArray.add(new FirstFragment());
fragmentsArray.add(new SecondFragment());
fragmentsArray.add(new ThirdFragment());
//Initialize adapter and attach it to view pager
ViewPagerFragmentAdapter adapterViewPager = new ViewPagerFragmentAdapter(
getSupportFragmentManager(),
fragmentsArray
);
viewPager.setAdapter(adapterViewPager);
}
您的魔力来了,设置听众:
ViewPager 页面选择监听器(滑动或其他方式):
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float v, int i1) { }
@Override
public void onPageSelected(int position) {
//Here goes the magic
switch (position) {
case 0:
navigationView.setSelectedItemId(R.id.menu_first_fragment);
break;
case 1:
navigationView.setSelectedItemId(R.id.menu_second_fragment);
break;
case 2:
navigationView.setSelectedItemId(R.id.menu_third_fragment);
break;
default:
//Handle exception
break;
}
}
@Override
public void onPageScrollStateChanged(int position) { }
});
BottomNavigation 项目选择侦听器:
navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.menu_first_fragment:
viewPager.setCurrentItem(0);
break;
case R.id.menu_second_fragment:
viewPager.setCurrentItem(1);
break;
case R.id.menu_third_fragment:
viewPager.setCurrentItem(2);
break;
default: return false;
break;
}
//I'm not sure if you should return true or false but you can try
return true;
}
});
最后,要选择最后一个片段 onBackPressed(),应将其保留在变量中,并调用 viewPager.setCurrentItem(lastFragmentPosition); ,监听器将自动触发,并设置 NavigationView 正确的项目,
我已经很长时间没有使用Java了,但是我相信这段代码没有任何错误。
注意:如果您希望每次使用此方法时都返回一个新的片段实例,则可以直接在适配器中使用 getItem(position)方法初始化片段。调用,在这种情况下,您将不需要构造函数中的 ArrayList ,也不要忘记在 getCount()方法中返回片段的数量
编码愉快!
答案 3 :(得分:0)
我希望您在使用addToBackStack(null)
时不要使用BottomNavigationBar
,而是返回onBackPressed();
上的home片段
为此,您可以使用
FragmentManager manager;
Fragment frag = manager.findFragmentById(R.id.your_frame_layout);
并检查instanceof
变量中的frag
对象
`if (frag instanceof HomeFragment) {
super.onBackPressed();//Exits the app if home fragment
} else {
manager.beginTransaction().replace(R.id.frame_layout, new HomeFragment()).commit();
//returns to home fragment when user presses back button
navigation.setSelectedItemId(R.id.navigation_home);
}`