今天我大概花了4個小時在做,但一整個大失敗,我期望將 SettingFragment 的資料傳到 HomeFragment,然後根據設定修改測驗的內容,可是我在寫的過程中瘋狂碰壁,導致我心態有點糟糕,等到鐵人賽結束後應該還會再寫幾篇來補一下遺憾,我盡力而為。
整理一下遇到的三大問題:
Xml 的資料讀取方式,之前在寫資料的時候就有碰到一些 xml 讀取資料的問題,所以一開始我直接建一個 map 來存資料,但資料太多,所以我就重新爬文找方法,後來在 android 的官網找到 string-array 的寫法,所以我在 strings.xml 把所有的日文資料都存起來了。
strings.xml
<string-array name="JP_Hiragana_half_voiced">
<item>ぱ</item> <!--pa-->
<item>ぴ</item>
<item>ぷ</item>
<item>ぺ</item>
<item>ぽ</item>
</string-array>
HomeFragment.kt
val resources: Resources = Resources.getSystem()
val array = resources.getStringArray(R.array.JP_Hiragana_half_voiced)
網路上 Fragment 的資料說多不多,但大部分都是 java 的程式,而且做法太多了很亂,我花了兩個小時在研究不同的方法,最後成功用 bundle 把 setting 的資料傳到 home。
build.gradle.kts (Module :app),加入下面這行
dependencies {
implementation("androidx.fragment:fragment-ktx:1.6.1")
}
想要傳資料的 Fragment
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentSettingBinding.inflate(inflater,container,false)
val view = viewBinding.root
viewBinding.switch1.setOnClickListener{
val bundle: Bundle = Bundle()
bundle.putString("switch",viewBinding.switch1.isChecked.toString())
setFragmentResult("switchData",bundle)
}
return view
}
想要接收資料的 Fragment
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentHomeBinding.inflate(inflater,container,false)
val view = viewBinding.root
setFragmentResultListener("switchData"){
_, bundle ->
viewBinding.textView2.text = bundle.getString("switch")
}
return view
}
最後一個問題,也是我最頭痛的,首先是 map 是唯獨的狀態,但我如果改成 mutableMap 的寫法,程式會直接Crash,經過一番糾結我改成用兩個 array 存資料,但因為不熟悉 Kotlin 的陣列,所以再次 Crash,怎麼修都還是 Crash,我原地放棄。
這 30 天比我想像的還要充實,因為要教別人的緣故,有很多平常我應該會直接忽略的事情都有認真爬文,多虧如此知道了很多有趣的知識,雖然還是有很多東西超級亂的XD,但我相信透過寫專題的教學方式,應該有帶給大家不少的收穫。
之後我應該會把這 30 天做的專案都丟到 github 上,如有需要再麻煩等我幾天。
謝謝大家陪我度過糊裡糊塗的30天。
Android Developers - 字串資源
https://developer.android.com/guide/topics/resources/string-resource?hl=zh-tw
【Android,Kotlin】前画面のFragmentに値を返す
https://www.google.com/search?client=firefox-b-d&q=XML+陣列讀取#ip=1
Send Data from one Fragment to Another Fragment || Fragment to Fragment Communication || 2021
https://developer.android.com/guide/topics/resources/string-resource?hl=zh-tw
Android Fragment 共用 ViewModel
https://medium.com/evan-android-note/android-fragment-共用-viewmodel-19a6d9161421
【Kotlin】第4課-陣列(Array)
https://chikuwa-tech-study.blogspot.com/2021/05/kotlin-array.html
【Kotlin】第5課-集合(List、Set、Map)
https://chikuwa-tech-study.blogspot.com/2021/05/kotlin-list-set-map.html