底部导航图标未相对于加载的片段突出显示
Bottom Navigation icons not highlighting with respect to the loaded fragment
我有,
- 两个片段(Fragment1,Fragment2)。
- 两个按钮(frag1 中的 Btn1,frag2 中的 Btn2)。
- 底部导航视图。
单击 frag1 中的 Btn 后,我们将被定向到 frag2。
单击 frag2 中的 Btn 后,我们将被定向到 frag1。
从片段(1->2 或 2->1)引导时,底部导航视图上的图标保持不变
有没有办法针对加载的片段突出显示该图标?
frag1 中 btn 的点击监听器
this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.body_container, new Fragment2()).commit();
frag2 中 btn 的点击监听器
this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.body_container, new Fragment1()).commit();
MainActivity 代码中底部导航的 OnItemSelectedListener
((BottomNavigationView)findViewById(R.id.bottom_nav)).setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener(){
Fragment clickedFragment = null;
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.one: clickedFragment = new Fragment1(); break;
case R.id.two: clickedFragment = new Fragment2(); break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.body_container, clickedFragment).commit();
return true;
}
});
setOnItemSelectedListener
仅在 BottomNavigationView 的选定项更改时触发。您当前正在做的是更改当前显示的片段。您应该设置 BottomNavigationView 的选定项,而不是更改片段。这样的东西应该可以工作
((BottomNavigationView) findViewById(R.id.bottom_nav)).setSelectedItemId(R.id.your_menu_item_id);
在主 activity 所在的同一包中创建一个 class temp 并向其中添加以下字段。
public static BottomNavigationView bottomNavigationView;
看一下代码,我在评论中解释了。
主要Activity代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView bottomNavView = temp.bottomNavigationView = findViewById(R.id.bottom_nav);
//This line, initially when the app is opened, displays the fragment1 by default
getSupportFragmentManager().beginTransaction().replace(R.id.body_container, new Fragment1()).commit();
bottomNavView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener(){
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment clickedFragment = null;
switch (item.getItemId()) {
case R.id.one: clickedFragment = new Fragment1(); break;
case R.id.two: clickedFragment = new Fragment2(); break;
}
//This line replaces the fragment when user clicks on icon of bottom navigation view
getSupportFragmentManager().beginTransaction().replace(R.id.body_container, clickedFragment).commit();
return true;
}
});
}
3.OnViewCreated 片段 1
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.btn_to_frag2).setOnClickListener(l->{
temp.bottomNavigationView.setSelectedItemId(R.id.two);
});
}
4.OnViewCreated 片段 2
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.btn_to_frag1).setOnClickListener(l->{
temp.bottomNavigationView.setSelectedItemId(R.id.one);
});
}
我有,
- 两个片段(Fragment1,Fragment2)。
- 两个按钮(frag1 中的 Btn1,frag2 中的 Btn2)。
- 底部导航视图。
单击 frag1 中的 Btn 后,我们将被定向到 frag2。
单击 frag2 中的 Btn 后,我们将被定向到 frag1。
从片段(1->2 或 2->1)引导时,底部导航视图上的图标保持不变
有没有办法针对加载的片段突出显示该图标?
frag1 中 btn 的点击监听器
this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.body_container, new Fragment2()).commit();
frag2 中 btn 的点击监听器
this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.body_container, new Fragment1()).commit();
MainActivity 代码中底部导航的 OnItemSelectedListener
((BottomNavigationView)findViewById(R.id.bottom_nav)).setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener(){
Fragment clickedFragment = null;
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.one: clickedFragment = new Fragment1(); break;
case R.id.two: clickedFragment = new Fragment2(); break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.body_container, clickedFragment).commit();
return true;
}
});
setOnItemSelectedListener
仅在 BottomNavigationView 的选定项更改时触发。您当前正在做的是更改当前显示的片段。您应该设置 BottomNavigationView 的选定项,而不是更改片段。这样的东西应该可以工作
((BottomNavigationView) findViewById(R.id.bottom_nav)).setSelectedItemId(R.id.your_menu_item_id);
在主 activity 所在的同一包中创建一个 class temp 并向其中添加以下字段。
public static BottomNavigationView bottomNavigationView;
看一下代码,我在评论中解释了。
主要Activity代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); BottomNavigationView bottomNavView = temp.bottomNavigationView = findViewById(R.id.bottom_nav); //This line, initially when the app is opened, displays the fragment1 by default getSupportFragmentManager().beginTransaction().replace(R.id.body_container, new Fragment1()).commit(); bottomNavView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener(){ @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { Fragment clickedFragment = null; switch (item.getItemId()) { case R.id.one: clickedFragment = new Fragment1(); break; case R.id.two: clickedFragment = new Fragment2(); break; } //This line replaces the fragment when user clicks on icon of bottom navigation view getSupportFragmentManager().beginTransaction().replace(R.id.body_container, clickedFragment).commit(); return true; } }); }
3.OnViewCreated 片段 1
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.btn_to_frag2).setOnClickListener(l->{
temp.bottomNavigationView.setSelectedItemId(R.id.two);
});
}
4.OnViewCreated 片段 2
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.btn_to_frag1).setOnClickListener(l->{
temp.bottomNavigationView.setSelectedItemId(R.id.one);
});
}