我熟悉Navigation graph
API。我有一个带有抽屉的应用程序,还有一些使用NavHostFragment
在navigation controller
中显示的片段。在导航方面,我认为它可以正常工作,但最大的问题是更新(取消当前菜单)菜单项。
使用我的旧方法,当我启动应用程序时,我将手动从menu item
获取第一个NavigationView
并将其设置为menuItem.setChecked(true)
,然后执行onNavigationItemSelected
并检查被点击的项目,例如:
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
menuItem.setChecked(true);
drawer.closeDrawers();
int id = menuItem.getItemId();
switch (id) {
case myfragId:
//Inflate fragment
}
return true;
}
由于片段的膨胀是manual process
,因此用户再也没有机会单击过并且错误的menu item
是check或not checked
,对于Navigation片段,无论何时发生的情况用户单击back button
会导航到上一个片段,但是右边的NavigationView menu item
永远不会是checked
,实际上没有项目是ever checked
。我知道我需要手动执行此操作,但是我不知道该如何执行。
下面是我的代码。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(MainActivity.this);
setSupportActionBar(toolbar);
navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.mainHostFragment);
appBarConfiguration = new AppBarConfiguration.Builder(navHostFragment.getNavController().getGraph())
.setDrawerLayout(drawer)
.setFallbackOnNavigateUpListener(() -> NavigationUI.navigateUp(navHostFragment.getNavController(), drawer))
.build();
NavigationUI.setupWithNavController(navigationView, navHostFragment.getNavController());
NavigationUI.setupActionBarWithNavController(this, navHostFragment.getNavController(), appBarConfiguration);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
public boolean onSupportNavigateUp() {
return NavigationUI.navigateUp(navHostFragment.getNavController(), appBarConfiguration);
}
@Override
public void onBackPressed() {
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}