导航抽屉:如何在启动时设置选定的项目?

我的代码完美地工作:每次导航抽屉中的项目被点击时,项目被选中。

当然,我想用默认片段(home)启动应用程序,但是Navigation Drawer没有select该项目。 如何以编程方式select该项目?

public class BaseApp extends AppCompatActivity { //Defining Variables protected String LOGTAG = "LOGDEBUG"; protected Toolbar toolbar; protected NavigationView navigationView; protected DrawerLayout drawerLayout; private DateManager db = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.base_layout); navigationView = (NavigationView) findViewById(R.id.navigation_view); // set the home/dashboard at startup FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.frame, new DashboardFragment()); fragmentTransaction.commit(); setNavDrawer(); } private void setNavDrawer(){ // Initializing Toolbar and setting it as the actionbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); //Initializing NavigationView //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { // This method will trigger on item Click of navigation menu @Override public boolean onNavigationItemSelected(MenuItem menuItem) { //Checking if the item is in checked state or not, if not make it in checked state // I THINK THAT I NEED EDIT HERE... if (menuItem.isChecked()) menuItem.setChecked(false); else menuItem.setChecked(true); //Closing drawer on item click drawerLayout.closeDrawers(); //Check to see which item was being clicked and perform appropriate action switch (menuItem.getItemId()) { //Replacing the main content with ContentFragment case R.id.home: DashboardFragment dashboardFragment = new DashboardFragment(); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.frame, dashboardFragment,"DASHBOARD_FRAGMENT"); fragmentTransaction.commit(); return true; [...] 

我认为我需要在这里编辑:

 if (menuItem.isChecked()) menuItem.setChecked(false); else menuItem.setChecked(true); 

或者在App创build时使用FragmentTransaction创buildonCreate

感谢您的支持。

使用下面的代码:

 navigationView.getMenu().getItem(0).setChecked(true); 

调用setNavDrawer();后调用此方法setNavDrawer();

getItem(int index)方法得到MenuItem然后你可以调用setChecked(true); 在那个MenuItem ,你所要做的就是找出哪个元素索引是默认的,并用这个索引replace0。

您可以通过调用select(突出显示)该项目

 onNavigationItemSelected(navigationView.getMenu().getItem(0)); 

这里是一个参考链接: http : //thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html

编辑没有工作nexus 4,支持库修订24.0.0。 我推荐使用

navigationView.setCheckedItem(R.id.nav_item);

回答下面的@kingston。

您也可以致电:

 navigationView.setCheckedItem(id); 

该方法在API 23.0.0中引入

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedIds"> <group android:id="@+id/group" android:checkableBehavior="single"> <item android:id="@+id/menu_nav_home" android:icon="@drawable/ic_home_black_24dp" android:title="@string/menu_nav_home" /> </group> </menu> 

注意: android:checkableBehavior="single"

另见这个

对于我来说这两种方法都不起作用:

  • navigationView.getMenu().getItem(0).setChecked(true);
  • navigationView.setCheckedItem(id);

试试这个,它适合我。

onNavigationItemSelected(navigationView.getMenu().findItem(R.id.nav_profile));

示例( NavigationView.OnNavigationItemSelectedListener ):

 private void setFirstItemNavigationView() { navigationView.setCheckedItem(R.id.custom_id); navigationView.getMenu().performIdentifierAction(R.id.custom_id, 0); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setFirstItemNavigationView(); } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { FragmentManager fragmentManager = getFragmentManager(); switch (item.getItemId()) { case R.id.custom_id: Fragment frag = new CustomFragment(); // update the main content by replacing fragments fragmentManager.beginTransaction() .replace(R.id.viewholder_container, frag) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .addToBackStack(null) .commit(); break; } 

TKS

谷歌总是有很多“哦,很棒”的支持库。 如果你想检查一个项目而不降级你的支持库版本,只需在设置检查状态之前设置可检查。

 MenuItem item = drawer.getMenu().findItem(R.id.action_something); item.setCheckable(true); item.setChecked(true); 

如果您在菜单的xml文件中设置可选,它也可能工作

您可以突出显示并使用以下单线select项目:

 navigationView.getMenu().performIdentifierAction(R.id.posts, 0); 

资料来源: https : //stackoverflow.com/a/31044917/383761

API 23提供了以下方法:

 navigationView.setCheckedItem(R.id.nav_item_id); 

但是,由于某些原因,这个函数不会导致导航条目后面的代码运行。 该方法肯定会突出显示导航抽屉中的项目,或者“检查”该项目,但是如果启动屏幕取决于导航抽屉select,则似乎不会调用OnNavigationItemSelectedListener导致启动时出现空白屏幕。 有可能手动调用这个监听器,但是这看起来很诡异:

 if (savedInstanceState == null) this.onNavigationItemSelected(navigationView.getMenu().getItem(0)); 

上面的代码假定:

  1. 您已在您的活动中实施了NavigationView.OnNavigationItemSelectedListener
  2. 你已经打电话给:
    navigationView.setNavigationItemSelectedListener(this);
  3. 您想要select的项目位于位置0

你必须为此调用2个函数:

首先:用于onNavigationItemSelected已在onNavigationItemSelected侦听器中实现的命令:

 onNavigationItemSelected(navigationView.getMenu().getItem(R.id.nav_camera)); 

第二:将导航抽屉菜单项的状态更改为选中(或选中):

 navigationView.setCheckedItem(R.id.nav_camera); 

我称这两个函数,它为我工作。

以下代码只会使菜单项被选中:

navigationView.setCheckedItem(id);

要select并打开菜单项,请在上面的行后添加以下代码。

onNavigationItemSelected(navigationView.getMenu().getItem(0));

首先为选定的项目创build颜色。 这里https://stackoverflow.com/a/30594875/1462969很好的例子。; 它可以帮助你改变图标的​​颜色。 要更改所有选定项目的背景,请在您的values \ style.xml文件中添加此项

  <item name="selectableItemBackground">@drawable/selectable_item_background</item> 

selectable_item_background应该在drawable / selectable_item_background.xml中声明

  <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/accent_translucent" android:state_pressed="true" /> <item android:drawable="@android:color/transparent" /> </selector> 

哪里可以在style.xml中声明颜色

  <color name="accent_translucent">#80FFEB3B</color> 

之后

  // The main navigation menu with user-specific actions mainNavigationMenu_ = (NavigationView) findViewById(R.id.main_drawer); mainNavigationMenu_.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { mainNavigationMenu_.getMenu().findItem(itemId).setChecked(true); return true; } }); 

正如你所看到的,我使用了mainNavigationMenu_.getMenu()。findItem(itemId).setChecked(true); 设置选定的项目。 这里navigationView

  <android.support.design.widget.NavigationView android:id="@+id/main_drawer" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/header_main_navigation_menu" app:itemIconTint="@color/state_list" app:itemTextColor="@color/primary" app:menu="@menu/main_menu_drawer"/> 

这是我的解决scheme,非常简单。

这是我的menu.xml文件:

 <group android:id="@+id/grp1" android:checkableBehavior="single"> <item android:id="@+id/nav_all_deals" android:checked="true" android:icon="@drawable/ic_all_deals" android:title="@string/all_deals" /> <item android:id="@+id/nav_news_and_events" android:icon="@drawable/ic_news" android:title="@string/news_and_events" /> <item android:id="@+id/nav_histories" android:icon="@drawable/ic_histories" android:title="@string/histories" /> </group> 

以上菜单将突出显示第一个菜单项。 下面的行会做一些事情(例如:显示第一个片段等)。 注意:在'configuration您的抽屉代码'

 onNavigationItemSelected(mNavigationView.getMenu().getItem(0)); 

下面的代码用于select第一个项目,并突出显示菜单中选定的第一个项目。

onNavigationItemSelected(mNavigationView.getMenu()的getItem(0).setChecked(真));

为导航器的个性化项目制作一个select器

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/darkBlue" android:state_pressed="true"/> <item android:drawable="@color/darkBlue" android:state_checked="true"/> <item android:drawable="@color/textBlue" /> </selector> 

在您的NavigationView中进行一些更改

 <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:itemBackground="@drawable/drawer_item" android:background="@color/textBlue" app:itemIconTint="@color/white" app:itemTextColor="@color/white" app:menu="@menu/activity_main_drawer" /> 

出于某种原因,最好使用ID来查找MenuItem。

 drawer.getMenu().findItem(R.id.action_something).setChecked(true);