iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

目錄

  1. 程式時間
  2. 美化 BottomNavigationView
  3. 虛擬裝置測試

正文

程式時間

接下來是快樂的撰寫切換分頁的程式碼時間,需要透過 binding 來偵測我們的 BottomNavigationView 被選擇的 item 是哪一個,然後去呼叫

  1. 看到 res/menu/menu.xml,我們需要給每 item 一個 id 方便呼叫,程式碼如下:
    <item
        android:id="@+id/home_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:title="Home"
        android:icon="@drawable/ic_home"/>
    <item
        android:id="@+id/setting_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:title="Setting"
        android:icon="@drawable/ic_setting"/>
    <item
        android:id="@+id/about_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:title="About"
        android:icon="@drawable/ic_about"/>
    
  2. 回到 java/MainActivity,使用 setOnItemSelectedListener 讓我們知道是哪個 item 被點擊了,程式碼如下:
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    
        binding.bottomNavigationView.setOnItemSelectedListener { menuItem->
            when(menuItem.itemId){ // 功能跟 case 一樣,差別只有這是 Kotlin 的寫法
                R.id.home_item->{
                    true
                }
                R.id.setting_item->{
                    true
                }
                R.id.about_item->{
                    true
                }
                else->false
            }
        }
    }
    
  3. 接下來我們需要寫一個 methon 用來做 fragment 的切換,這邊先到 activity_main.xml 給 FrameLayout 一個 id
    <FrameLayout
        android:id="@+id/frame_layout"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </FrameLayout>
    
  4. 再回到 java/MainActivity 寫我們可愛的 methon,需要宣告兩個變數一個是 FragmentManager 用來操作 Fragment 以及 FragmentTransaction 做切換,最後用到 replace,將原本的 Fragment 用取代的方式切換成新的頁面,程式碼如下:
    private fun replaceFragment(fragment:Fragment){
        val fragmentManager:FragmentManager = supportFragmentManager
        val fragmentTransaction:FragmentTransaction = fragmentManager.beginTransaction()
        fragmentTransaction.replace(R.id.frame_layout,fragment)
        fragmentTransaction.commit()
    }
    
  5. methon 寫完後,就可以在剛剛的 when 裡面加入 replaceFragment ,參數是呼叫 java 檔裡我們新增的三個 Fragment,程式碼如下:
    when(menuItem.itemId){
        R.id.home_item->{
            replaceFragment(HomeFragment())
            true
        }
        R.id.setting_item->{
            replaceFragment(SettingFragment())
            true
        }
        R.id.about_item->{
            replaceFragment(AboutFragment())
            true
        }
        else->false
    }
    
  6. 最後我們要記得一件很重要的事情,初始畫面是 Home,所以在程式的前面也要記的初始化初始畫面
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        replaceFragment(HomeFragment()) // 加入這行
    
    		/.../
    }
    

美化 BottomNavigationView

為了補償各位所以今天加碼!我們來學怎麼讓畫面變漂亮,作法來自參考資料最下面的 YT 連結,大家也可以去看看。

  1. 首先我們要新增一些素材,在 values/colors.xml 新增一個顏色作為 bottom 的底色和沒有被選到時的顏色,大家可以根據色碼表選一個喜歡的顏色,這是我的範例:
    <color name="bottom_backgroundColor">#5A5AAD</color>
    <color name="bottom_unclick">#d2d2d2</color>
    
  2. 然後新增一個 bottom 的背景,對 drawable 點擊右鍵,在 New 裡選擇 Drawable Resource File
  3. name 取一個喜歡的名字,Root element 填入 shape,我們希望它是一個形狀,點擊 OK
    https://ithelp.ithome.com.tw/upload/images/20231003/20162387bovzY7qvvm.png
  4. 再新增一個針對 item 的設定,對 drawable 點擊右鍵,在 New 裡選擇 Drawable Resource File
  5. name 取一個喜歡的名字,點擊 OK
    https://ithelp.ithome.com.tw/upload/images/20231003/20162387RCn0HkuQqS.png
  6. 我們要寫當 item 被選擇時以及沒有被選擇時的設定,這邊主要修改只有顏色,程式碼如下:
    <item
        android:state_selected="true"
        android:color = "@color/white"/>
    <item
        android:state_selected="false"
        android:color = "@color/bottom_unclick"/>
    
  7. 素材準備完成後,回到 activity_main.xml,開始進行一些神奇的改造,大家可以一行一行加,然後看看畫面的變化,非常有趣,程式碼如下:
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigationView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/bottom_background"
        android:layout_marginEnd="20dp"
        android:layout_marginStart="20dp"
        android:layout_marginBottom="30dp"
        android:layout_marginTop="30dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="parent"
        app:menu="@menu/menu"
        app:itemIconSize="30dp"
        app:itemIconTint="@drawable/item_selector"
        app:itemRippleColor="@android:color/transparent"
        app:labelVisibilityMode="unlabeled"/>
    

虛擬裝置測試

快樂的分頁~影片連結

總結

經過了三天的努力,我們終於把分頁給做完了,分頁的學問可真多啊!學習上遇到最大的困難只有資料幾乎是 Java 的,沒看到甚麼 Kotlin 的教學,就算有我也看不懂 orz,但還是順利完成了。

下一篇會輕鬆一點,教大家怎麼把應用程式下載到實體手機上!

參考資料

Bottom Navigation Bar - Android Studio | Fragments | Java | 2023
https://www.youtube.com/watch?v=jOFLmKMOcK0

Day 26 - Bottom Navigation ( Implementation )
https://ithelp.ithome.com.tw/articles/10307281?sc=iThelpR

Android 基礎的 Fragment 使用方式
https://medium.com/@waynechen323/android-基礎的-fragment-使用方式-730858c12a43

How to Implement Bottom Navigation with Activities | Android Studio Tutorial
https://www.youtube.com/watch?v=MUl19ppdu0o&t=711s


上一篇
Day.17 學習XML 大師菁英班 - 增加分頁 2
下一篇
Day.19 實體手機連接
系列文
剛學Kotlin的我想要玩安卓開發,自學 Android Studio 30 天31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言