這次想要實作 Bottom Navigation
需要實作的功能有
我們可以透過修改 AndroidManifest.xml 來更改 Activity Title
直接在想要更改的 Activity 下增加 android:label 來修改
<activity android:name=".Activity.Home2Activity"
android:label="Home2">
我們可以再導入 Fragment 前使用 title 給予值
R.id.dashboard -> {
title = "Dashboard"
supportFragmentManager.beginTransaction()
.replace(R.id.frameLayout, DashboardFragment())
.commit()
}
我們在 Home2Activity.kt 裡面加入
val actionBar = supportActionBar
actionBar?.setDisplayHomeAsUpEnabled(true)
並且在 AndroidManifest 中指定其 PARENT_ACTIVITY 為何者
<activity android:name=".Activity.Home2Activity"
android:label="Home2">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".Activity.MainActivity" />
</activity>
首先我們要在 activity_main.xml 中加入一個 FrameLayout 當作 Fragment 的容器,以及一個 BottomNavigationView
我們先在 Layout resource file 建立一個 menu 並設定相關參數,並在 activity_main.xml 裡引用
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="0dp"
android:layout_marginStart="0dp"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/navigation" />
我們可以透過 supportFragmentManager 來讓 HomeFragment 取代 MainActivity 中的 FrameLayout
supportFragmentManager.beginTransaction()
.replace(R.id.frameLayout, HomeFragment())
.commit()
*BottomNavigation + Fragment
我們自訂 listener 的方式來管理 BottomNavigation 與 Fragment 之間的關係
判斷使用者按下的 BottomNavigation 的 id 來載入相對應的 Fragment
回傳 true or false 關係到 BottomNavigation 的動畫顯示
private var listener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.home -> {
supportFragmentManager.beginTransaction()
.replace(R.id.frameLayout, HomeFragment())
.commit()
}
R.id.dashboard -> {
title = "Dashboard"
supportFragmentManager.beginTransaction()
.replace(R.id.frameLayout, DashboardFragment())
.commit()
}
R.id.notifications -> {
title = "Notification"
supportFragmentManager.beginTransaction()
.replace(R.id.frameLayout, NotificationFragment())
.commit()
}
}
true
}
我們在 HomeFragment 中有需要 Intent 至另一個 Activity
請注意必須寫在 onStart
override fun onStart() {
super.onStart()
homeBtn.setOnClickListener {
val home2Intent = Intent(activity,Home2Activity::class.java)
startActivity(home2Intent)
}
}