發表文章

目前顯示的是 2018的文章

從 Java 開發者角度看 JavaScript 之語法差異

本篇是我的研究心得筆記,用 Google 文件撰寫。 內容會根據學習情況不定時更新,且直接複製貼上的版面不好看,也懶得再修改...... 請透過以下連結觀看: https://goo.gl/72qPpk

Android 使用 AutoCompleteTextView 搭配 SQLite 取得曾經輸入的資料

圖片
為了讓輸入資料時更方便,試著使用了 AutoCompleteTextView 想讓 App 自動顯示以前輸入過的資料。 首先需要設定 AutoCompleteTextView 的 Adapter,一般的範例都使用 SimpleCursorAdapter。 但是我們可以發現到,它會列出所有該欄位的內容,這樣子使用者先輸入的文字就沒有意義了。 原本想直接在 Cursor 設定 query 的條件,但沒想到竟然無效!不得已只好另尋它法,於是就在 SimpleCursorAdapter 找到了 setFilterQueryProvider。 這邊有兩個重點要注意: 第一是根據 SimpleCursorAdapter 的父類別 CursorAdapter 的設計,資料的欄位(Column)必須包含「_id」這個名字的欄位,所以在 SQL 指令的 SELECT 後必須加入「_id」。 第二個則是使用者體驗的考量,不要讓結果出現重複的內容;這可以在 SQL 指令中使用「GROUP BY」來實現。 下面左圖為沒有 GROUP BY,右圖則有使用 GROUP BY: 到這邊看似已經完成了吧?但其實還有最後一個坑! 點選自動完成的內容後,得到的不是想像中的文字,而是類似物件位址的一長串字! 原因是前面 setFilterQueryProvider 得到的是 Cursor,而我們必須再從中取出需要的資料。 這邊使用的是 setCursorToStringConverter。 做到這一步,終於完成了

在小米手機上用 ShortcutBadger 實作桌面圖示的數字標記

圖片
最近在做一個案子,需要讓 App 的圖示角落顯示數字標記。但是原生 Android 並沒有提供這個功能,而是各家廠商在他們的 Launcher 上面下功夫;直到 Android 8.0 才終於有了......一個小點標記。 下面是官方網站的示意圖 然而這個並不符合我的需求,於是就在網路上找到了一個滿有名的專案: ShortcutBadger ShortcutBadger 支援的廠牌不少,使用也簡單。 而他的 GitHub Wiki 上有特別提到小米手機的 MIUI 6 以上的版本需要用比較特別的作法 https://github.com/leolin310148/ShortcutBadger/wiki/Xiaomi-Device-Support 因為 MIUI 6 以上的標記數字是跟該 App 的通知數量連動的,因此範例的作法是透過 IntentService 來發送通知。 其中這個方法裡面其實就是小米開發者網站上所教導的方法 https://dev.mi.com/console/doc/detail?pId=939 好不容易整合好後,卻發現了一個現象。那就是每當出現數字後,點擊 App 圖示進入再返回桌面後,數字就會消失,但通知列表卻還有 App 的通知。以此推斷,只要進入過 App 之後,MIUI 會視為已經讀取過通知而把數字移除。因此,這裡要做的就是在每次退出 App 之後都要更新通知數量。 另外,以上方法目前發現在 Android 8.0 + MIUI 10 沒有作用。 可能需要等官方再公佈新方法,或者請各位高手自行研究了~

Android UI 元件 RecyclerView 多次初始化後空隙變大

圖片
最近在重構我的 Android App 程式碼,把 ListView 這個過時元件全改用 RecyclerView 代替。 發現某些地方的 RecyclerView 在經過多次資料重整(每次重整都會初始化一次)後,每個 item 中的空隙竟然變大了!!??? 下面兩張圖是正常的樣子和經過多次重整的樣子(點擊右上角圖示可重整),可以看到每行的高度變高了,甚至分隔線的顏色還變黑......   開啟顯示版面配置界限後,可以看到每個 item 下緣都有多出一些空白 經過一番檢查後,發現問題出在這邊 這段程式碼會在每次資料重整後設定 RecyclerView 一些 layout 狀態,其中這行正是問題的關鍵: recyclerView . addItemDecoration( new DividerItemDecoration (context, DividerItemDecoration . VERTICAL )); 只要把這行搬到 onCreate() 等地方讓它不要重複設定就可以解決問題! 不過基本上這個 RecyclerView 的 layout 並不會有其它變化,因此可以將這兩行一起搬走也不會有問題 recyclerView . setLayoutManager( new LinearLayoutManager (context)); recyclerView . addItemDecoration( new DividerItemDecoration (context, DividerItemDecoration . VERTICAL )); 至於為什麼會有這種情況?分析了一下 RecyclerView 原始碼,可以看到 addItemDecoration 這個方法做的事就是將 ItemDecoration 加入一個 ArrayList。 mItemDecorations 是一個 ArrayList 物件 然後在 onDraw() 方法中將它們全部繪出 如此可以解釋為空白間隙是連續繪出 ItemDecoration 所疊加的結果。

Android 刷機(HTC M8) - 無法進入 TWRP Recovery

在刷我的舊手機 HTC M8 時,發生安裝 ROM 到一半時疑似 TWRP Recovery 崩潰而自動重啟的情況。結果就無法進入 Recovery 了...... 嘗試解決後整理出了下列步驟: 1. Relock: fastboot oem lock 2. Unlock: fastboot flash unlocktoken Unlock_code.bin 3. 解鎖後會自動重啟進入 TWRP,而跑到一半會再自動重啟 4. 刷舊版 TWRP: fastboot flash recovery twrp-3.0.2-0-m8.img 5. 重啟就可以進入 Recovery,但刷機時會有誤判 ROM 不符合手機機型的問題 6. 刷新版 TWRP: fastboot flash recovery twrp-3.2.3-0-m8.img 7. 重啟進入 Recovery,完成! 以上給有同樣問題的朋友參考~~

Android Activity 轉場動畫

圖片
Android 設計 Activity 之間的轉場動畫大致有下列三類方法: overridePendingTransition ActivityOptionsCompat Theme Style overridePendingTransition 這是 Android 典型的方法。 首先在 res/anim/ 目錄下建立 xml 檔來自訂動畫 然後分別在 startActivity 下一行以及下一個 Activity 的 finish() 函式中加上 overridePendingTransition 即可呈現兩個 Activities 之間來回的轉場動畫。 第一種方法的好處是直覺、自訂性高、且相容性高;缺點則是要分別在每個 startActivity 和 finish() 加上程式碼,不免覺得繁瑣。當程式碼量大的時候就不容易整理各個 Activity 之間的邏輯。 ActivityOptionsCompat 這是在 Android 5.0 後加入的新方法,也能向下相容舊版本。 用法是先宣告一個 ActivityOptionsCompat,並選擇它內建的方法去設定 xml,然後把它加入在 startActivity 的引數中即可。 至於返回的動畫則是在下一個 Activity 中加入 finishAfterTransition 這行來結束 Activity(相當於先執行動畫再 finish())。 但卻發現直接這樣寫是沒有作用的!! 查了一下網路後,發現似乎是還要設定叫做「共享元素」的東西。這部份比較複雜,因此尚未研究清楚...... 而 ActivityOptionsCompat 還有內建一些符合 Material Design 設計的動畫,如果只需要著重在進入轉場又懶得自訂 xml 的話則可以使用它們做出美觀的動畫。 ActivityOptionsCompat.makeClipRevealAnimation(View source, int startX, int startY, int width, int height) ActivityOptionsCompat.makeScaleUpAnimation(View source, int startX, int startY, int star