效果
底部导航.gif
布局
<?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">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_nav"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:defaultNavHost="true"/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="?android:attr/windowBackground"
android:elevation="5dp"
app:itemBackground="?android:attr/windowBackground"
app:itemIconTint="@color/select_bottom_nav_color"
app:itemTextColor="@color/select_bottom_nav_color"
app:labelVisibilityMode="labeled"
app:menu="@menu/bottom_nav_menu"/>
</LinearLayout>
HomeFragment/FaqFragment/UserFragment
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
class HomeFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_home, container, false)
}
}
MainActivity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.navigation.NavController
import androidx.navigation.NavGraph
import androidx.navigation.NavGraphNavigator
import androidx.navigation.NavigatorProvider
import androidx.navigation.fragment.NavHostFragment
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.wy.base.FixFragmentNavigator
import com.wy.home.FaqFragment
import com.wy.home.HomeFragment
import com.wy.navigation.NavigationFragment
import com.wy.user.UserFragment
class MainActivity : AppCompatActivity() {
private var navController:NavController? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var navHostFragment: NavHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_nav) as NavHostFragment
navController = navHostFragment.navController
//创建自定义的Fragment导航器
val fragmentNavigator = FixFragmentNavigator(this, navHostFragment.childFragmentManager, navHostFragment.id)
//获取导航器提供者
val provider = navController!!.navigatorProvider
//把自定义的Fragment导航器添加进去
provider.addNavigator(fragmentNavigator)
//手动创建导航图
val navGraph = initNavGraph(provider, fragmentNavigator)
//设置导航图
navController!!.setGraph(navGraph)
// NavigationUI.setupWithNavController(mBinding.bottomNav, navController)
//底部导航设置点击事件
//底部导航设置点击事件
var bottomNav: BottomNavigationView = findViewById(R.id.bottom_nav)
bottomNav.setOnNavigationItemSelectedListener { item ->
navController!!.navigate(item.getItemId())
true
}
bottomNav.itemTextAppearanceActive = R.style.bottom_selected_text;
bottomNav.itemTextAppearanceInactive = R.style.bottom_normal_text;
}
/**
* 初始化导航图表
*/
private fun initNavGraph(provider:NavigatorProvider, fragmentNavigator:FixFragmentNavigator):NavGraph{
val navGraph = NavGraph(NavGraphNavigator(provider))
//用自定义的导航器来创建目的地
val destination1 = fragmentNavigator.createDestination()
destination1.id = R.id.navigation_home
destination1.className = HomeFragment::class.java.canonicalName
destination1.label = resources.getString(R.string.HomeFragment)
navGraph.addDestination(destination1)
val destination2 = fragmentNavigator.createDestination()
destination2.id = R.id.navigation_faq
destination2.className = FaqFragment::class.java.canonicalName
destination2.label = resources.getString(R.string.FaqFragment)
navGraph.addDestination(destination2)
val destination3 = fragmentNavigator.createDestination()
destination3.id = R.id.navigation_navi
destination3.className = NavigationFragment::class.java.canonicalName
destination3.label = resources.getString(R.string.NavigationFragment)
navGraph.addDestination(destination3)
val destination5 = fragmentNavigator.createDestination()
destination5.id = R.id.navigation_mine
destination5.className = UserFragment::class.java.canonicalName
destination5.label = resources.getString(R.string.UserFragment)
navGraph.addDestination(destination5)
navGraph.startDestination = R.id.navigation_home
return navGraph
}
}
color/select_bottom_nav_color
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@color/color_0099ff" />
<item android:color="@color/color_3e3e3e" android:state_selected="false" />
</selector>
menu/bottom_nav_menu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/navigation_home"
android:icon="@drawable/ic_icon_home"
android:title="首页" />
<item
android:id="@+id/navigation_faq"
android:icon="@drawable/ic_icon_faq"
android:title="问答" />
<item
android:id="@+id/navigation_navi"
android:icon="@drawable/ic_icon_navigation"
android:title="导航" />
<item
android:id="@+id/navigation_mine"
android:icon="@drawable/ic_icon_mine"
android:title="我的" />
</menu>
navigation/app_nav
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/app_nav"
app:startDestination="@id/navigation_home">
<fragment
android:id="@+id/navigation_home"
android:name="com.wy.home.HomeFragment"
android:label="HomeFragment"
tools:layout="@layout/fragment_home"/>
<fragment
android:id="@+id/navigation_faq"
android:name="com.wy.home.FaqFragment"
android:label="FaqFragment"
tools:layout="@layout/fragment_fqa"/>
<fragment
android:id="@+id/navigation_navi"
android:name="com.wy.navigation.NavigationFragment"
android:label="FaqFragment"
tools:layout="@layout/fragment_navigation"/>
<fragment
android:id="@+id/navigation_mine"
android:name="com.wy.user.UserFragment"
android:label="UserFragment"
tools:layout="@layout/fragment_user" />
</navigation>
网友评论