在Android BottomNavigationView中设置所选项目

Mic*_*ael 98 android bottomnavigationview

我正在使用android.support.design.widget.BottomNavigationView支持库中的新功能.如何从代码中设置当前选择?我意识到,旋转屏幕后,选择会更改回第一项.当然,它也将有所帮助,如果有人能告诉我,如何"拯救"的当前状态BottomNavigationViewonPause功能,以及如何将其在恢复onResume.

谢谢!

Ric*_*rdo 140

从API 25.3.0开始,我们引入了一种方法setSelectedItemId(int id),让您将项目标记为已选中,就像它被点击一样.

来自docs:

设置所选的菜单项ID.这与点击项目的行为相同.

代码示例:

BottomNavigationView bottomNavigationView;
bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavigationView);
bottomNavigationView.setOnNavigationItemSelectedListener(myNavigationItemListener);
bottomNavigationView.setSelectedItemId(R.id.my_menu_item_id);
Run Code Online (Sandbox Code Playgroud)

重要

必须已经将所有项目添加到菜单并在调用setSelectedItemId之前设置监听器,以便BottomNavigationView可以运行相应代码的行为.如果在添加菜单项之前调用setSelectedItemId并设置监听器,则不会发生任何事情.

  • 这不起作用,它只更新选项卡本身,它不会触发setOnNavigationItemSelectedListener事件 (2认同)
  • 如果你没有在 `onTabSelected` 中定义行为,它显然不会做任何事情。阅读文档 -> 设置选定的菜单项 ID。这与点击一个项目的行为相同。它来自 Android 开发者 (2认同)

kar*_*nms 47

要以编程方式单击您需要使用的BottomNavigationBar项:

View view = bottomNavigationView.findViewById(R.id.menu_action_item);
view.performClick();
Run Code Online (Sandbox Code Playgroud)

这将正确排列所有项目及其标签.

  • 这是一个关于这个问题的黑客行为.您可以使用库中的方法来执行所需的操作.如果你不能那么这是因为你做错了 (4认同)

Via*_*lav 45

对于那些仍然使用SupportLibrary <25.3.0的人

我不确定这是否是这个问题的完整答案,但我的问题非常相似 - 我必须back按下按钮并将用户带到他之前的标签.所以,也许我的解决方案对某些人有用:

private void updateNavigationBarState(int actionId){
    Menu menu = bottomNavigationView.getMenu();

    for (int i = 0, size = menu.size(); i < size; i++) {
        MenuItem item = menu.getItem(i);
        item.setChecked(item.getItemId() == actionId);
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住,如果用户按其他导航选项卡BottomNavigationView不会清除当前选定的项目,那么您需要onNavigationItemSelected在处理导航操作后调用此方法:

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.some_id_1:
            // process action
            break;
        case R.id.some_id_2:
            // process action
            break;
        ...
        default:
            return false;
    }

    updateNavigationBarState(item.getItemId());

    return true;
}
Run Code Online (Sandbox Code Playgroud)

关于保存实例状态,我认为您可以使用相同action id的导航视图并找到合适的解决方案.

  • 至少在26.1.0 / 27.1.0上,您无需取消选中其他项目 (5认同)

Ash*_*ini 13

bottomNavigationView.setSelectedItemId(R.id.action_item1);
Run Code Online (Sandbox Code Playgroud)

action_item1菜单项ID 在哪里。


小智 12

使用它来按菜单 id 设置选定的底部导航菜单项

MenuItem item = mBottomNavView.getMenu().findItem(menu_id);
item.setChecked(true);
Run Code Online (Sandbox Code Playgroud)

  • 如果使用 Jetpack 导航,则使用此选项可以避免导航到该项目 (5认同)

Ask*_*kov 8

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

   bottomNavigationView.setOnNavigationItemSelectedListener(this);
   Menu menu = bottomNavigationView.getMenu();
   this.onNavigationItemSelected(menu.findItem(R.id.action_favorites));
}
Run Code Online (Sandbox Code Playgroud)


ism*_*oui 7

您可以尝试执行Click方法:

View view = bottomNavigationView.findViewById(R.id.YOUR_ACTION);
view.performClick();
Run Code Online (Sandbox Code Playgroud)

编辑

从 API 25.3.0 开始,引入了一种方法setSelectedItemId(int id),可以让您将项目标记为选中,就好像它被点击一样。


Boy*_*Boy 6

现在可以从25.3.0版本开始调用setSelectedItemId()\ o /


小智 6

添加android:enabled="true"到底部导航菜单项。

然后bottomNavigationView.setOnNavigationItemSelectedListener(mListener)通过执行将其设置为选中状态bottomNavigationView.selectedItemId = R.id.your_menu_id


小智 6

navigationView.getMenu().findItem(R.id.navigation_id).setChecked(true);
Run Code Online (Sandbox Code Playgroud)


小智 5

在 API 25 之上,您可以使用 setSelectedItemId(menu_item_id) 但在 API 25 之下,您必须采取不同的做法,用户 Menu 获取句柄,然后 setChecked 到已检查的特定项目


beh*_*rad 5

        bottomNavigationView.getMenu().getItem(POSITION).setChecked(true);
Run Code Online (Sandbox Code Playgroud)

  • 这是我以编程方式构建菜单时可以做到的唯一方法。 (2认同)

Mic*_*ael 4

似乎已在 SupportLibrary 25.1.0 中修复:) 编辑:似乎已修复,旋转屏幕时保存选择的状态。