关闭和打开抽屉后,NavigationView 中图标的检查状态错误
Checked state for icon is wrong in NavigationView after closing and opening drawer
我已经尝试从 Android 支持设计库中实现新的 NavigationView。该应用程序由一个 DrawerLayout 和一个包含 NavigationView 的 Fragment 组成。带有图标的简单菜单。
我在启动应用程序时未检查任何项目。
然后我点击一个项目,项目被选中,文本和图标都显示选中状态:
然后我通过滑动打开和关闭抽屉。现在发生的是我选择的项目的文本显示选择状态,但图标没有。另一方面,上面的项目有显示选中状态的图标。
这是一个错误还是我做错了什么?
我用app截图可以看这里:
解决方案是将 NavigationView 直接放入 DrawerLayout 中,而不是放在 Fragment 中。
遇到和你一样的问题...(我已经从 fragment 中删除了导航视图)。
这个解决方案对我有用。
您可以尝试不从片段中移除导航视图。
试试这个结构:
public your class
{
private int mNavItemId;
private static final String NAV_ITEM_ID = "navItemId";
onCreate()
{
if (null == savedInstanceState) {
mNavItemId = R.id.home;
} else {
mNavItemId = savedInstanceState.getInt(NAV_ITEM_ID);
}
//call setupnavigationview
setupnavigationview();
}
private void setupNavigationView() {
mNavigationView = (NavigationView) findViewById(R.id.navigation_view);
mNavigationView.getMenu().findItem(mNavItemId).setChecked(true);
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// update highlighted item in the navigation menu
menuItem.setChecked(true);
mNavItemId = menuItem.getItemId();
mDrawerLayout.closeDrawer(GravityCompat.START);
switch (menuItem.getItemId()) {
case R.id.id_of_your_menu_item:
call your fragment
break;
});
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(NAV_ITEM_ID, mNavItemId);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if (item.getItemId() == android.support.v7.appcompat.R.id.home) {
return mDrawerToggle.onOptionsItemSelected(item);
}
return super.onOptionsItemSelected(item);
}
}
我已经尝试从 Android 支持设计库中实现新的 NavigationView。该应用程序由一个 DrawerLayout 和一个包含 NavigationView 的 Fragment 组成。带有图标的简单菜单。
我在启动应用程序时未检查任何项目。
然后我点击一个项目,项目被选中,文本和图标都显示选中状态:
然后我通过滑动打开和关闭抽屉。现在发生的是我选择的项目的文本显示选择状态,但图标没有。另一方面,上面的项目有显示选中状态的图标。
这是一个错误还是我做错了什么?
我用app截图可以看这里:
解决方案是将 NavigationView 直接放入 DrawerLayout 中,而不是放在 Fragment 中。
遇到和你一样的问题...(我已经从 fragment 中删除了导航视图)。 这个解决方案对我有用。 您可以尝试不从片段中移除导航视图。
试试这个结构:
public your class
{
private int mNavItemId;
private static final String NAV_ITEM_ID = "navItemId";
onCreate()
{
if (null == savedInstanceState) {
mNavItemId = R.id.home;
} else {
mNavItemId = savedInstanceState.getInt(NAV_ITEM_ID);
}
//call setupnavigationview
setupnavigationview();
}
private void setupNavigationView() {
mNavigationView = (NavigationView) findViewById(R.id.navigation_view);
mNavigationView.getMenu().findItem(mNavItemId).setChecked(true);
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// update highlighted item in the navigation menu
menuItem.setChecked(true);
mNavItemId = menuItem.getItemId();
mDrawerLayout.closeDrawer(GravityCompat.START);
switch (menuItem.getItemId()) {
case R.id.id_of_your_menu_item:
call your fragment
break;
});
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(NAV_ITEM_ID, mNavItemId);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if (item.getItemId() == android.support.v7.appcompat.R.id.home) {
return mDrawerToggle.onOptionsItemSelected(item);
}
return super.onOptionsItemSelected(item);
}
}