导航抽屉不适用于导航组件
Posted
技术标签:
【中文标题】导航抽屉不适用于导航组件【英文标题】:Navigation Drawer don't work with navigation Component 【发布时间】:2019-08-22 04:21:03 【问题描述】:当用户点击菜单项时,导航抽屉不会让用户到达目的地。导航抽屉显示正确,但不起作用。有什么问题?
我有一个导航菜单:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
...
<item
android:id="@+id/feedbackFragment"
android:icon="@drawable/ic_help"
android:title="@string/title_help" />
</group>
</menu>
还有导航图:
<fragment
android:id="@+id/feedbackFragment"
android:name="com.company.ru.ui.FeedBackFragment"
android:label="fragmegment_feedback"
tools:layout="@layout/fragment_feed_back" />
在我的 MainActivity 中,我有一个工具栏(全部复制):
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_
android:layout_
android:background="@color/color_white">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_
android:layout_
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_
android:layout_
app:navGraph="@navigation/main_graph" />
</LinearLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/nv"
android:layout_
android:layout_
android:layout_gravity="start"
android:background="@color/color_white"
android:theme="@style/NavigationView"
app:headerLayout="@layout/nav_header"
app:itemIconPadding="@dimen/margin_16"
app:itemIconTint="#FFD000"
app:itemTextColor="@android:color/black"
app:menu="@menu/navigation_menu" />
</androidx.drawerlayout.widget.DrawerLayout>
我以这种方式初始化我的抽屉:
@Override
protected void onCreate(Bundle savedInstanceState)
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
controller = Navigation.findNavController(this, R.id.nav_host_fragment);
initToolbar(getString(R.string.splash_screen_text));
private void initToolbar(String title)
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionbar = getSupportActionBar();
if (actionbar != null)
actionbar.setDisplayHomeAsUpEnabled(true);
actionbar.setHomeAsUpIndicator(R.drawable.ic_dehaze);
actionbar.setTitle(title);
toolbar.setTitleTextAppearance(this, R.style.RobotoBoldTextAppearance);
initDrawer();
private void initDrawer()
drawerLayout = findViewById(R.id.drawer_layout);
Toolbar toolbar = findViewById(R.id.toolbar);
NavigationUI.setupWithNavController(toolbar, controller, drawerLayout);
我是按向导做的,但这很奇怪,在我看来一切都应该没问题。
我不喜欢我不使用NavigationView
,我认为这不行。
【问题讨论】:
【参考方案1】:根据Add a Navigation Drawer documentation,如果要将其连接到导航控制器,则需要使用NavigationView
调用setupWithNavController
。此外,您正在使用setSupportActionBar()
。根据Action Bar documentation,您不应该使用NavigationUI.setupWithNavController(toolbar, controller, drawerLayout)
,而是使用setupActionBarWithNavController()
方法
private void initDrawer()
drawerLayout = findViewById(R.id.drawer_layout);
// Set up the Action Bar with NavController
NavigationUI.setupActionBarWithNavController(this, controller, drawerLayout);
// Now hook up your NavigationView
NavigationView navigationView = findViewById(R.id.nv);
NavigationUI.setupWithNavController(navigationView, controller);
您还需要根据Action Bar documentation 使用setSupportActionBar()
时覆盖onSupportNavigateUp()
:
@Override
public boolean onSupportNavigateUp()
return navController.navigateUp(drawerLayout) || super.onSupportNavigateUp();
我还应注意if (actionBar != null)
检查和其中的代码被导航覆盖 - 标题应通过目的地上的android:label
设置。
【讨论】:
以上是关于导航抽屉不适用于导航组件的主要内容,如果未能解决你的问题,请参考以下文章