Android Studio中Navigation底部菜单点击无跳转问题求助
问题:底部菜单点击无法跳转至目标页面
在Android Studio中使用View Binding和Navigation组件开发时,点击底部菜单无法切换到导航图中id为saveFragment的页面。
相关代码
项目级build.gradle
buildscript { repositories { google() } dependencies { def nav_version = "2.5.3" classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version") } } plugins { id 'com.android.application' version '7.3.1' apply false id 'com.android.library' version '7.3.1' apply false id 'org.jetbrains.kotlin.android' version '1.7.20' apply false id 'com.google.dagger.hilt.android' version "2.44" apply false }
模块级build.gradle
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' id "com.google.dagger.hilt.android" id "androidx.navigation.safeargs.kotlin" } android { namespace 'com.example.newsapiclient' compileSdk 32 defaultConfig { applicationId "com.example.newsapiclient" minSdk 26 targetSdk 32 versionCode 1 versionName "1.0" buildConfigField("String","API_KEY", MY_KEY) buildConfigField("String","BASE_URL",MY_URL) testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding = true } } dependencies { def lifecycle_version = "2.5.1" def nav_version = "2.5.3" implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.google.code.gson:gson:2.10.1' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4" implementation "com.squareup.retrofit2:retrofit:2.9.0" implementation "com.squareup.retrofit2:converter-gson:2.9.0" // ViewModel implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version") // ViewModel utilities for Compose implementation("androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version") // LiveData implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version") kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" implementation("com.google.dagger:hilt-android:2.44") kapt("com.google.dagger:hilt-android-compiler:2.44") implementation("androidx.navigation:navigation-fragment-ktx:$nav_version") implementation("androidx.navigation:navigation-ui-ktx:$nav_version") implementation 'com.github.bumptech.glide:glide:4.14.2' kapt 'com.github.bumptech.glide:compiler:4.14.2' testImplementation 'junit:junit:4.13.2' testImplementation "com.squareup.okhttp3:mockwebserver:4.10.0" testImplementation "com.google.truth:truth:1.1.3" androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' }
导航图nav_graph.xml
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_graph" app:startDestination="@id/newsFragment"> <fragment android:id="@+id/newsFragment" android:name="com.example.newsapiclient.NewsFragment" android:label="fragment_news" tools:layout="@layout/fragment_news" > <action android:id="@+id/action_newsFragment_to_infoFragment" app:destination="@id/infoFragment" /> </fragment> <fragment android:id="@+id/saveFragment" android:name="com.example.newsapiclient.SaveFragment" android:label="fragment_save" tools:layout="@layout/fragment_save" > <action android:id="@+id/action_saveFragment_to_infoFragment" app:destination="@id/infoFragment" /> </fragment> <fragment android:id="@+id/infoFragment" android:name="com.example.newsapiclient.InfoFragment" android:label="fragment_info" tools:layout="@layout/fragment_info" /> </navigation>
MainActivity代码
class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val navHostFragment = supportFragmentManager .findFragmentById(R.id.fragmentContainerView) as NavHostFragment val navController = navHostFragment.navController } }
底部菜单bottom_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/newsFragment" android:icon="@drawable/ic_baseline_live_tv_24" android:title="News Headlines" /> <item android:id="@+id/saveFragment" android:icon="@drawable/ic_baseline_save_24" android:title="Save News" /> </menu>
解决方案
问题核心是未将底部导航栏与Navigation控制器绑定,导致菜单点击事件没有被Navigation组件处理。
修改MainActivity代码,添加导航控制器与底部导航栏的关联代码:
class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val navHostFragment = supportFragmentManager .findFragmentById(R.id.fragmentContainerView) as NavHostFragment val navController = navHostFragment.navController // 新增:绑定底部导航栏与导航控制器 NavigationUI.setupWithNavController(binding.bottomNav, navController) } }
注意:需确保
ActivityMainBinding中的底部导航栏控件id为bottomNav(对应布局文件中BottomNavigationView的android:id="@+id/bottomNav"),如果你的控件id不同,替换为实际id即可。
验证:重新运行应用,点击底部菜单即可正常切换到saveFragment页面。
内容的提问来源于stack exchange,提问作者Nazir
相关产品推荐
相关产品推荐

