Android 15 後模擬器鍵盤不顯示,如何開啟 Soft Keyboard?

問題說明 在 Android Studio Android 15 後的模擬器中,預設情況下開啟鍵盤會看到這樣的畫面: 畫面上只有一個可拖曳的設定 UI,卻沒有顯示任何鍵盤。 雖然你依然可以透過電腦實體鍵盤輸入文字,但若需要測試 軟體鍵盤與 App UI 的互動,就會非常不方便。 如何改回一般鍵盤顯示? 感謝 StackOverflow: How can I make the Android emulator show the soft keyboard? 上的解答,可以透過以下方式啟用模擬器的 Soft Keyboard: 方法一:透過模擬器浮動選單 在已點選輸入框的狀態下,點選模擬器畫面右側的 垂直浮動工具列,找到三條橫線並開啟選單,選擇 Settings。 在 Write in text fields 頁面,滑動到下方,將 Show on-screen keyboard 設為「開啟」。 完成後,就能看到軟體鍵盤正常顯示。 方法二:透過系統設定進入 若無法直接進入,可改用以下路徑: 開啟 系統設定 Settings 點選 System > Keyboard > On-screen keyboard 選擇 Gboard > Write in text fields 開啟 Show on-screen keyboard 完成設定後,鍵盤應該就會出現了: ...

Published on August 27, 2025 · 1 min · 83 words · Daniel Huang

TypedArray.use{} 在 Android 11 以下出錯? Crash 原因與正確寫法一次看懂

在 Android 開發中,我們常使用 Kotlin 的 use {} 語法來自動管理資源,例如關閉檔案、關閉資料庫 Cursor。但這個便利的語法在 Android 11 以下,對某些類別其實會出錯造成應用程式閃退。如果一時不查,小心這坑就這樣踩了下去… 錯誤說明 1 2 3 4 5 context .obtainStyledAttributes(attrs, R.styleable.ActionFooterView, 0, 0) .use { // ... } 這段程式碼在 Android 12(API 31)以上沒問題,但在 Android 11 (API 30) 以下執行時,會拋出以下錯誤: 1 2 java.lang.IncompatibleClassChangeError Class 'android.content.res.TypedArray' does not implement interface 'java.lang.AutoCloseable' in call to 'void java.lang.AutoCloseable.close()' 白話來說,上面這個錯誤告訴我們,TypedArray 並沒有實作 AutoCloseable 介面,所以在試圖呼叫 AutoCloseable.close() 時拋出 IncompatibleClassChangeError 錯誤。 問題釐清:use {} 的背後原理 Kotlin use {} 是一個 extension function,會在 Block 結束後自動呼叫 AutoCloseable.close() 方法來釋放資源。 ...

Published on June 12, 2025 · 1 min · 211 words · Daniel Huang

Android Studio Gemini Code Assist 安全設定:使用 .aiexclude 保護敏感資料

前言 許多開發者已經習慣使用各種 AI 工具來加速開發流程。對於 Android 開發者來說,如果不想額外付費,Google 官方推出的 Gemini Code Assist 無疑是最佳選擇之一。 不過,為了讓 Gemini 能提供貼近專案脈絡的建議,它需要讀取你專案內的檔案。但你是否曾經思考過:哪些檔案應該避免被 AI 存取? 保護機敏資料 這點就像我們使用 Git 時會建立 .gitignore 來排除不該同步的檔案一樣——像是金鑰、憑證等敏感資料。 在使用 Web 版 Gemini 時,避免提供檔案相對簡單;但在 Android Studio 中,則需要透過特定的機制進行設定。而這項機制,就是本文主角:.aiexclude 檔案。 認識 .aiexclude .aiexclude 是什麼? .aiexclude 的作用,就如同 .gitignore,放在專案資料夾下,告訴 Gemini 哪些檔案或資料夾應該排除在外、不被存取或索引。 .aiexclude 的語法規則與 .gitignore 完全一致,且支援路徑、萬用字元(如 *、**)、副檔名等。 實用語法範例 語法 說明 dev.properties 排除目錄中所有名稱為 dev.properties 的檔案 KEYS.* 排除所有名稱為 KEYS、任意副檔名的檔案 *.api 排除所有 .api 副檔名的檔案 /*.kt 僅排除 .aiexclude 所在目錄下的 .kt 檔案 my/sensitive/dir/ 排除指定目錄與其所有子目錄 my/sensitive/dir/**.txt 排除指定目錄及子目錄下所有 .txt 檔案 my/sensitive/dir/*.txt 僅排除該目錄下的 .txt 檔案,不包含子目錄 只要在專案根目錄(或任一子目錄)建立 .aiexclude 檔案,即可立即生效。 ...

Published on June 9, 2025 · 1 min · 136 words · Daniel Huang

Android 開發|用 easylauncher 為每個版本自動加上專屬 App Icon

在 Android 專案中常見多個 build variant?用 easylauncher-gradle-plugin 為不同版本自動加上辨識用 App Icon Ribbon,讓 debug、beta、release 一目了然,提升開發與測試效率!

Published on May 15, 2025 · 2 min · 227 words · Daniel Huang

Android 開發 | 讓 Gradle 自動為 AAR、AAB、APK 設定客製化檔名

每次打包 AAB 或 APK,Android Studio 預設都會產出像 app-release.aab 或 app-debug.apk 這類的檔案名稱。這種預設命名在使用 Firebase App Distribution 或 Google Play 內部測試流程時,雖然不太會造成困擾,但如果你需要將 APK 或 AAB 檔案直接提供給 PM、QA 或外部合作夥伴安裝測試,那麼能夠一眼看出檔案版本與類型,會讓流程更順暢也更不容易搞混。 本文將示範如何透過 Gradle 設定,讓你在打包時自動加上版本號、Build Type 等資訊,生成便於辨識的輸出檔名。 設定方式 你可以根據不同的產出檔案類型(AAB、APK、AAR),在 app module 或 library module 的 build.gradle 中加入以下設定。 AAB:變更 App Bundle 檔名 在 build.gradle(app module)中 android 區塊內加入以下設定: 1 2 3 4 android { // 其他設定省略... setProperty("archivesBaseName", "taiwanNo1") } BTW: setProperty(key, value) 在 groovy 與 kts 都是通用的。 🚨 注意: 這個設定只會影響輸出檔案名稱的前綴,並不會完整覆蓋檔名結構。例如: 1 2 原始檔名:app-release.aab 變更後:taiwanNo1-release.aab 💡 為什麼使用 archivesBaseName ? 因為目前 Gradle 尚未提供官方 API 可以直接命名 AAB 檔。 archivesBaseName 是 Gradle 用來設定各類 archives 類檔案輸出名稱的共通屬性。 所謂的 archives 檔案包含: APK、AAR、JAR、ZIP 等。 ...

Published on April 30, 2025 · Updated on May 14, 2025 · 2 min · 283 words · Daniel Huang