导航抽屉:如何在启动时设置选定的项目?
我的代码完美地工作:每次导航抽屉中的项目被点击时,项目被选中。
当然,我想用默认片段(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));
上面的代码假定:
- 您已在您的活动中实施了
NavigationView.OnNavigationItemSelectedListener
- 你已经打电话给:
navigationView.setNavigationItemSelectedListener(this);
- 您想要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);