今天用到Navigation来控制fragmnet导航,遇到了一个情况,bottomNavigationView.setupWithNavController(control)和菜单绑定后,菜单点击无效果,页面不能跳转;
代码很简单:
依赖版本:
androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version = "2.5.3" }
androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version = "2.5.3" }
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<fragment
android:id="@+id/nav_host_fragment_content_main"
android:layout_height="0dp"
android:layout_weight="1"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/navigation_graph"
/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="?android:attr/windowBackground"
app:menu="@menu/navigation_menu"/>
</LinearLayout>
activity代码:
package com.example.mynavigation
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.navigation.Navigation
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.NavigationUI
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.bottomnavigation.BottomNavigationView
class MainActivity : AppCompatActivity() {
private lateinit var bottomNavigationView: BottomNavigationView;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if(!::bottomNavigationView.isInitialized){
bottomNavigationView = findViewById(R.id.nav_view)
}
var control = findNavController(R.id.nav_host_fragment_content_main)
//val appBarConfiguration = AppBarConfiguration(
// setOf(
// R.id.fragment_first, R.id.fragment_second, R.id.fragment_third
// )
//)
//setupActionBarWithNavController(control, appBarConfiguration)
//NavigationUI.setupActionBarWithNavController(this, navController, configuration)
//bottomNavigationView.setupWithNavController(control)
NavigationUI.setupWithNavController(bottomNavigationView,control)
}
}
后经排查,发现问题出在了res/menu/navigation_menu和res/navigation/navigation_graph对应关系上面
想要有联动,这两个配置文件的id要一一对应:android:id="@+id/fragment_first"、android:id="@+id/fragment_second"、android:id="@+id/fragment_third"
res/menu/navigation_menu:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/fragment_first"
android:icon="@drawable/ic_home_black_24dp"
android:title="fragment1cc" />
<item
android:id="@+id/fragment_second"
android:icon="@drawable/ic_dashboard_black_24dp"
android:title="fragment2bb" />
<item
android:id="@+id/fragment_third"
android:icon="@drawable/ic_notifications_black_24dp"
android:title="fragment3ss" />
</menu>
res/navigation/navigation_graph
<?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"
android:id="@+id/navigation_graph"
app:startDestination="@id/fragment_first">
<fragment
android:id="@+id/fragment_first"
android:name="com.example.mynavigation.Fragment1"
android:label="fragment1">
<!-- <action-->
<!-- android:id="@+id/action_fragment_first_to_fragment_second"-->
<!-- app:destination="@id/fragment_second" />-->
</fragment>
<fragment
android:id="@+id/fragment_second"
android:name="com.example.mynavigation.Fragment2"
android:label="fragment2">
<!-- <action-->
<!-- android:id="@+id/action_fragment_second_to_fragment_third"-->
<!-- app:destination="@id/fragment_third"/>-->
</fragment>
<fragment
android:id="@+id/fragment_third"
android:name="com.example.mynavigation.Fragment3"
android:label="fragment3" />
</navigation>