#android #navigation #navigation-drawer
#Android #навигация #панель навигации
Вопрос:
Панель навигации не доставляет пользователя к месту назначения, когда он нажимает на пункт меню. Панель навигации отображается правильно, но не работает. Что может быть не так?
У меня есть меню навигации:
<?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_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@ id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
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_width="match_parent"
android:layout_height="match_parent"
app:navGraph="@navigation/main_graph" />
</LinearLayout>
<com.google.android.material.navigation.NavigationView
android:id="@ id/nv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
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:
Согласно документации по добавлению навигационного ящика, вам нужно вызвать setupWithNavController
свой NavigationView
, если вы хотите подключить его к NavController. Кроме того, вы используете setSupportActionBar()
. Согласно документации панели действий, вы должны использовать не 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);
}
Вам также потребуется переопределить onSupportNavigateUp()
при использовании setSupportActionBar()
в соответствии с документацией панели действий:
@Override
public boolean onSupportNavigateUp() {
return navController.navigateUp(drawerLayout) || super.onSupportNavigateUp();
}
Я должен также отметить, что if (actionBar != null)
проверка и код внутри переопределяются навигацией — заголовки должны быть установлены через android:label
в пунктах назначения.
Ответ №2:
Вот мой код, который работает у меня
MainActivity
private DrawerLayout drawerLayout;
private NavController navController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initToolBar();
}
private void initToolBar()
{
MaterialToolbar toolbar = findViewById(R.id.toolbar);
drawerLayout = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navController = Navigation.findNavController(this, R.id.nav_host_fragment);
setSupportActionBar(toolbar);
NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout);
NavigationUI.setupWithNavController(navigationView, navController);
}
@Override
public boolean onSupportNavigateUp() {
return NavigationUI.navigateUp(navController, drawerLayout) || super.onSupportNavigateUp();
}