iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
0

Bottom Navigation

BottomNavigation

這次想要實作 Bottom Navigation

需要實作的功能有

  • 希望每次切換畫面標題都能夠更換
  • HOME2, HOME3 左上角要有回到上一頁的按鈕
  • 完成 Bottom Navigation + Fragment

更改標題

  • 更改 Activity 標題

我們可以透過修改 AndroidManifest.xml 來更改 Activity Title
直接在想要更改的 Activity 下增加 android:label 來修改

<activity android:name=".Activity.Home2Activity"
            android:label="Home2">
  • 更改 Fragment 標題

我們可以再導入 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>

Fragment + Bottom Navigaion

首先我們要在 activity_main.xml 中加入一個 FrameLayout 當作 Fragment 的容器,以及一個 BottomNavigationView

  • Bottom Navigaion

我們先在 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" />
  • Fragment

我們可以透過 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)
        }

    }

上一篇
Day10_ImageList(RecyclerView實作)
下一篇
Day12_MyLocation_取得使用者權限
系列文
發現新大陸-Android Kotlin 開發之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
wdsjheheontheway
iT邦新手 5 級 ‧ 2019-02-08 12:09:40

請問frameLayout在那裡放置啊??

我要留言

立即登入留言