Missing parts when designing and implementing Android UI
昨天出席了 GDG Hong Kong 舉辦的 DevFest 2024 Hong Kong 並分享了「Missing parts when designing and implementing Android UI」。 這個題目大致分為三個部分: 一般在準備 Figma mockup 及由 mockup 實作成 Android app UI 時的常見問題,並以一 Figma Community 免費範本作例子 Jetpack Compose accessibility Jetpack Compose UI testing,示範 Compose testing 搭配 Robolectric 及支援 Appium 的貼士 ...
AndroidX Navigation component for Jetpack Compose type safety
AndroidX Navigation component 是 Google 推出的 single Activity app navigation library。本身是用 Fragment 來做每一頁的內容,然後再用新的 Android resource type——navigation 來定義 navigation graph(即是聲明一個 navigation graph 內有什麼 Fragment、打開 Fragment 時要什麼參數和各 Fragment 之間如何導覽的 XML 檔案)。如果加上 Safe Args Gradle plugin 的話就會按 navigation graph XML 檔案生成那些 Java code 去讓你在 Fragment 內轉頁時調用,那就不會怕轉頁時漏了幾個參數沒有傳到,因為漏了的話就不能成功 compile。 ...
Firebase Cloud Messaging legacy API
如果有用 Firebase Cloud Messaging (FCM) 或者其他關於 FCM 的第三方 SDK 的話應該會收到通知說 6 月 21 日會停用舊版的 FCM API(即是供 server 發送 notification 那個 API endpoint)。之後就要轉用 HTTP v1 API。 ...
Android WebView 筆記
好幾年都沒有特別去用 Android 的 WebView,近期工作需要用到 WebView,所以特別去查一下並將資料放在這篇文章內方便日後翻查。 AndroidX WebKit AndroidX 其實有 WebKit 的 artifact androidx.webkit:webkit,但不是把整個 browser 加到 app 入面(WebView 實際在用的 web browser 是由 Google Play Store 提供,並可以 developer options 切換),而是把部分較新的 WebView 功能加個檢查 function,如果目前的 WebView 支援那個功能的話就可以執行這部分的 code。 ...
Android 14 migration
最近把 MetroRide 的 API level 升到 34 (Android 14),中間發現了一些問題,在這裏記錄一下。 Foreground service MetroRide 有用到 AndroidX WorkManager 來下載離線資料並放到 SQLite database 內,而且開了 foreground service。在 Android 14 規定要加 permission FOREGROUND_SERVICE_DATA_SYNC 標明 foreground service 的目的。 ...
Android pseudolocale
在處理 app UI 多國語言時,我們不時要留意是不是預留了足夠空間來顯示文字。一般而言,中文內容通常都比其他語言短,你的 UI 可能看起來沒有問題,但換到其他寫得比較長的語言就可能不夠位顯示。但在開發初期可能還未開始翻譯,只有英文版,未必能在早期察覺這個問題。 ...
Android 13 Per-app Language Preferences
最近抽點時間把 MetroRide 參照 Now in Android 示範項目更新一下,例如改用 TOML 版的 version catalog(之前是用 Kotlin DSL)、轉用 includeBuild 加 convention plugin 取代之前把 plugin 放在 buildSrc 內、更新 dependency 版本和把 target SDK 升到最新(即是 Android 13;API level 33)。這次想分享的是適配 Android 13 的 per-app language preferences(個別應用程式語言偏好)功能。 ...
Jetpack Compose Navigation component sub-graph
這次遷移到 Compose 時特別花了時間試用 Compose 的 Navigation component,終於弄清 nested graph 的意義。其實 Compose 的 Navigation component 底層都是跟 XML 版的 Navigation component 一樣,只是底層多了以 route 形式的處理。以往的說明文件在介紹 nested navigation graph 時沒有太具體說明 nested graph 背後的意義,看完之後可能覺得只是用來避免單一 XML 檔過長而拆成不同 sub-graph。但其實在 deep link 時是有特別意義。 ...
Jetpack Compose 遷移 (2)
上一篇提過如何將 MetroRide 由傳統 view system 遷移到 Jetpack Compose。但一篇又太長,所以分拆成兩篇。 Dependency injection 按照官方的建議,composable function 要用到的 dependency 應該由 caller 經參數提供。然後就是由外層一直傳進去。至於那個外層最遠可以去到 Activity 或者 Fragment。由於 composable function 就是 top-level function,沒有 class 包住,所以平常用開的 Dagger 或者 Koin 之類的 DI library 都無辦法輕易地在 composable function 經 DI 拿到 dependency。如果以 Dagger Hilt 來計,目前是有這幾種方式: ...
Jetpack Compose 遷移 (1)
近幾個月斷斷續續替 MetroRide 的界面由傳統 view system(即是 layout XML)轉為 Jetpack Compose,順帶補上去年參加 iThome 鐵人賽時用來做示範的重鐵抵站時間功能。昨天新版 app 上架了就來分享一下遷移過程。其實這個 app 在之前的版本有把其中一頁靜態的頁面(延誤定義)改用 Compose,那時是在 Fragment 內的 onCreateView 加入 setContent 顯示 Compose 內容。由於那時只是做排版,沒有遇到大問題。之後開始慢慢轉用 Compose 才遇到問題。 ...