<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Android on 只放拖鞋的鞋櫃</title><link>https://jchu.cc/tags/android/</link><description>Recent content in Android on 只放拖鞋的鞋櫃</description><generator>Hugo</generator><language>zh-TW</language><lastBuildDate>Wed, 24 Aug 2022 21:54:19 +0800</lastBuildDate><atom:link href="https://jchu.cc/tags/android/index.xml" rel="self" type="application/rss+xml"/><item><title>Android 的 View.canScrollVertically 的誤讀</title><link>https://jchu.cc/2022/08/24-android_scroll.html</link><pubDate>Wed, 24 Aug 2022 21:54:19 +0800</pubDate><guid>https://jchu.cc/2022/08/24-android_scroll.html</guid><description>&lt;p&gt;在 Android 官方文件裡面有個 &lt;code&gt;View.canScrollVertically&lt;/code&gt;，起初我認為這個 API 文件寫錯了，後來再看了更多文件，才覺得是我的誤會。&lt;/p&gt;</description></item><item><title>在本機上存取 Android 的 sqlite 檔案</title><link>https://jchu.cc/2022/04/17-sqlite.html</link><pubDate>Sun, 17 Apr 2022 21:14:04 +0800</pubDate><guid>https://jchu.cc/2022/04/17-sqlite.html</guid><description>&lt;p&gt;之前紀錄過一篇怎麼在 Android Studio 裡面用 SQLScout 的 Plugin 存取 sqlite database&lt;/p&gt;
&lt;p&gt;其實用指令把 sqlite db 抓到本機端測試也一樣&lt;/p&gt;</description></item><item><title>kotlinx-coroutines-test migrate to 1.6 紀錄</title><link>https://jchu.cc/2022/03/30-coroutine-migration.html</link><pubDate>Wed, 30 Mar 2022 21:07:18 +0800</pubDate><guid>https://jchu.cc/2022/03/30-coroutine-migration.html</guid><description>&lt;p&gt;之前因為工作的需要，把 kotlin 從 &lt;code&gt;1.5.2&lt;/code&gt; 升級到 &lt;code&gt;1.6.0&lt;/code&gt;，同時修了許多 unit test 相關的問題，在這邊紀錄一下過程，給需要幫助的朋友。&lt;/p&gt;</description></item><item><title>離線閱讀 Android Doc</title><link>https://jchu.cc/2020/12/10-android-doc.html</link><pubDate>Thu, 10 Dec 2020 21:53:39 +0800</pubDate><guid>https://jchu.cc/2020/12/10-android-doc.html</guid><description>&lt;p&gt;寫 Android 的程式總是要時時閱讀本草綱目(API documentation)，才會確定應該呼叫哪個 API，就我所知某些人的做法是在 Android Studio 裡面直接看程式碼，不過我還是比較喜歡看精美的 HTML 檔案&lt;/p&gt;
&lt;p&gt;雖然很多人是看 online 的版本，不過我從大學時期養成的習慣，還是比較喜歡下載一份 offline 的版本，自己開瀏覽器閱讀。只是這件事情在 Android 上面愈來愈難做到了&amp;hellip;&lt;/p&gt;</description></item><item><title>Gralde build error</title><link>https://jchu.cc/2020/10/30-gradle.html</link><pubDate>Fri, 30 Oct 2020 16:34:37 +0800</pubDate><guid>https://jchu.cc/2020/10/30-gradle.html</guid><description>&lt;p&gt;在 Android 的 app moudle 裡面，嘗試把一些獨立的類別搬到新增加的一個 library module 的時候，遇到了類似這樣的錯誤&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt; The consumer was configured to find an API of a component, as well as attribute &amp;#39;com.android.build.api.attributes.BuildTypeAttr&amp;#39; with value &amp;#39;debug&amp;#39;, attribute &amp;#39;org.jetbrains.kotlin.platform.type&amp;#39; with value &amp;#39;androidJvm&amp;#39;. However we cannot choose between the following variants of project :common-libs:&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Android Studio 觀察 Sqlite Database</title><link>https://jchu.cc/2020/09/02-sqlscout.html</link><pubDate>Wed, 02 Sep 2020 22:03:07 +0800</pubDate><guid>https://jchu.cc/2020/09/02-sqlscout.html</guid><description>&lt;p&gt;最近在改一個 open source 記帳 App，其實也只是隨便亂改一通，讓它的 UI 看得順眼且堪用而已。修改的過程中需要查詢 App 裡面用到的 SQLite db，所以搜尋到一個 SQLScout 的 IDEA IDE Plugin，覺得滿好用，順手紀錄一下用法。&lt;/p&gt;</description></item><item><title>實作 Google Authenticator 的兩階段驗證</title><link>https://jchu.cc/2020/08/16-twofactor.html</link><pubDate>Sun, 16 Aug 2020 02:22:34 +0800</pubDate><guid>https://jchu.cc/2020/08/16-twofactor.html</guid><description>&lt;p&gt;之前聽到 Tim 說 PTT 的現有的登入方式不改的話很沒救，我想到兩階段驗證的方法，所以好奇研究了一下該怎麼做。實際上看了才知道比想像中簡單，PTT 有意願的話，實作難度真的不高。&lt;/p&gt;
&lt;p&gt;Google Authenticator (後面簡稱 GA)是常見的兩階段驗證(2FA)會用到的程式，好比 GitHub 或是 Facebook 的兩階段驗證都能用這隻程式取得驗證碼。如果你的網站服務想要利用 2FA 增加安全性，利用 GA 可以算是非常便宜的方案 - 不需要自己寫 client App，只要自己的網站加上一些簡單的流程與演算法就能取得 2FA 的優點。&lt;/p&gt;
&lt;p&gt;本文簡介如何實作，並且附上驗證的程式。&lt;/p&gt;</description></item><item><title>Kotlin coroutine 基礎筆記</title><link>https://jchu.cc/2020/03/22-coroutine.html</link><pubDate>Sun, 22 Mar 2020 21:59:50 +0800</pubDate><guid>https://jchu.cc/2020/03/22-coroutine.html</guid><description>&lt;p&gt;Coroutine 算是 Kotlin 裡面相當引人注目的功能，簡單來說就是可以幫助處理非同步需求的機制。&lt;/p&gt;
&lt;p&gt;舉例來說，我們常常看到這樣的需求：按下一個 Fetch 的按鈕，去抓網路上的某個列表來更新手機內的資料，同時又不希望 UI thread 被卡住。在 Android 上面經常就是祭出 AsyncTask，或是用 Rx 的方式來處理。利用 Coroutine，這些功能都會變得比較簡單實作&lt;/p&gt;</description></item><item><title>使用 ConstraintLayout 建構畫面</title><link>https://jchu.cc/2017/09/16-constraintlayout.html</link><pubDate>Sat, 16 Sep 2017 22:42:12 +0800</pubDate><guid>https://jchu.cc/2017/09/16-constraintlayout.html</guid><description>&lt;p&gt;ConstraintLayout 是 Support Library 裡面新增的一個 ViewGroup，從功能上來看非常強大，效能上不輸、甚至&lt;a href="https://android-developers.googleblog.com/2017/08/understanding-performance-benefits-of.html"&gt;贏過&lt;/a&gt;傳統的 Layout。因為放在 Support Library 裡面，幾乎市面上所有的手機都相容，就放心使用吧。&lt;/p&gt;
&lt;p&gt;以往在建構複雜的畫面時，經常是 LinearLayout 與 RelativeLayout 等等相互組合，拼湊出相當深且複雜的樹狀 xml。略懂 View render 過程的都知道，效能就在層層的 measurement/layout 之中持續消耗。改用 ConstraintLayout 取代傳統 Layout 的複雜組合，把 xml 檔變得更加扁平，效率很容易就能提升。&lt;/p&gt;
&lt;p&gt;粗看 ConstraintLayout 會覺得跟 RelativeLayout 有點像，其實它還能做到很多 RelativeLayout 做不到的事情。以下就稍微簡介 ConstraintLayout 的安裝與使用。&lt;/p&gt;</description></item><item><title>使用 Checkstyle/Ktlint 檢查 Java/Kotlin 語法</title><link>https://jchu.cc/2017/09/13-checkstyle.html</link><pubDate>Wed, 13 Sep 2017 00:14:12 +0800</pubDate><guid>https://jchu.cc/2017/09/13-checkstyle.html</guid><description>&lt;p&gt;多人開發的場合，大家寫程式的習慣用法往往不一樣。除了實作上的思維不同，在所難免，至少在程式碼風格上可以一致。&lt;/p&gt;
&lt;p&gt;不同的語言有不同的 coding style，在 Java 裡面我通常就是參考(以前是 Sun Microsystems 現在是 Oracle) &lt;a href="http://www.oracle.com/technetwork/java/javase/documentation/codeconvtoc-136057.html"&gt;Code Conventions for the Java TM Programming Language&lt;/a&gt;。隨著開發時間的拉長，遞交程式的數量變多之後，總是會有幾次忘記加上空白之類的小瑕疵，這種檢查理當交給程式去做。&lt;/p&gt;
&lt;p&gt;雖然寫程式沒有 freestyle，但是我們有 &lt;a href="http://checkstyle.sourceforge.net/"&gt;checkstyle&lt;/a&gt;&lt;/p&gt;</description></item><item><title>TransitionDrawable 用兩張以上的圖</title><link>https://jchu.cc/2017/09/04-drawable.html</link><pubDate>Mon, 04 Sep 2017 21:55:51 +0800</pubDate><guid>https://jchu.cc/2017/09/04-drawable.html</guid><description>&lt;p&gt;當我們需要一張圖片，慢慢交錯顯示出另外一張圖片的時候，經常使用 TransitionDrawable。繼承自 LayerDrawable 的 TransitionDrawble 的實作，則是在 &lt;a href="https://android.googlesource.com/platform/frameworks/base/&amp;#43;/oreo-r6-release/graphics/java/android/graphics/drawable/TransitionDrawable.java#205"&gt;onDraw&lt;/a&gt; 的時候只拿前兩張來交換顯示。&lt;/p&gt;
&lt;p&gt;實務上使用時，需要交換顯示的圖片往往不只兩張，這時候就需要一點取巧的做法。&lt;/p&gt;</description></item><item><title>開發 Android App 階段啟用 StrictMode</title><link>https://jchu.cc/2017/09/03-strictmode.html</link><pubDate>Sun, 03 Sep 2017 23:20:17 +0800</pubDate><guid>https://jchu.cc/2017/09/03-strictmode.html</guid><description>&lt;p&gt;開發 App 的階段，通常是把條件弄得更嚴苛會比較好。除了常見的，把 &lt;strong&gt;Don&amp;rsquo;t keep Activity&lt;/strong&gt; 打開以外，還有一個就是啟動 &lt;a href="https://developer.android.com/reference/android/os/StrictMode.html"&gt;StrictMode&lt;/a&gt;&lt;/p&gt;</description></item><item><title>ViewPager 與 FragmentStatePagerAdapter</title><link>https://jchu.cc/2017/09/02-viewpager.html</link><pubDate>Sat, 02 Sep 2017 22:24:34 +0800</pubDate><guid>https://jchu.cc/2017/09/02-viewpager.html</guid><description>&lt;p&gt;在 Android 上面想要做兩三個 Tabs，並且希望透過左右滑動切換 Tab 的時候，通常就會用到 &lt;a href="https://developer.android.com/reference/android/support/v4/view/ViewPager.html"&gt;ViewPager&lt;/a&gt;。若希望每個 Tab 都是一個獨立的 Fragment，我們能使用 &lt;a href="https://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html"&gt;FragmentStatePagerAdapter&lt;/a&gt;。只是這個 Adapter 的使用方法跟 ListView 或 RecyclerView 的 Adapter 有點不一樣，一不小心就會踩到洞。&lt;/p&gt;
&lt;p&gt;測試的方法也不難，只要進到系統設定裡面的開發者選項，把 &lt;strong&gt;Don&amp;rsquo;t keep activties&lt;/strong&gt; 打開便能測試。就我自己的經驗，在 MainActivity 用了 ViewPager 顯示幾個 Fragments，打開一個新的 Activity 觸發系統將 MainActivity 砍掉，接著回到 MainActivity 的時候就能發現，所有的 View 都是 null。&lt;/p&gt;</description></item><item><title>Android 的 ExternalStorage</title><link>https://jchu.cc/2017/08/21-storage.html</link><pubDate>Mon, 21 Aug 2017 00:29:52 +0800</pubDate><guid>https://jchu.cc/2017/08/21-storage.html</guid><description>&lt;p&gt;在 Android 上要儲存檔案經常會用到 Internal 或 External &lt;a href="https://developer.android.com/guide/topics/data/data-storage.html"&gt;Storage&lt;/a&gt;，對部分的應用程式來說，常見的需求是「把檔案存到 SD card」。&lt;/p&gt;
&lt;p&gt;從結論來說，Android 並沒有 SD card 這樣的概念，External Storage 也不一定是外接式儲存裝置。先有這樣的認知，接著就可以問以下幾個問題&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有哪些 Storage 可以用？&lt;/li&gt;
&lt;li&gt;Context 與 Environment 有哪些 Storage 的 API 可以用？&lt;/li&gt;
&lt;li&gt;有怎樣的權限問題？&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>RxJava Javadoc</title><link>https://jchu.cc/2016/10/10-rxjavadoc.html</link><pubDate>Mon, 10 Oct 2016 12:20:02 +0800</pubDate><guid>https://jchu.cc/2016/10/10-rxjavadoc.html</guid><description>&lt;p&gt;&lt;em&gt;2018/04/02 Update: add 2.1.12 doc download point&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ReactiveX is cool, as well as RxJava. If you are developing app and using RxJava, of course you often refer &lt;a href="http://reactivex.io/RxJava/javadoc/"&gt;RxJava documentations&lt;/a&gt;. I would like to refer its javadoc from my local host, but cannot find out a download point. Therefore I make a copy and upload it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.2.0
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dl.dropboxusercontent.com/u/9824121/rxjava-javadoc.zip"&gt;Download RxJava 1.2.0 javadoc from Dropbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://drive.google.com/open?id=0Bwg-OI96Zt_BU2VMY0xmWHJ0OFE"&gt;Download RxJava 1.2.0 javadoc from GoogleDrive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;About 40MB, includes all images&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.1.12
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dropbox.com/s/diwj6hgioggjnho/rxjava-2.1.12-javadoc.zip"&gt;Download RxJava 2.1.12 javadoc from Dropbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://drive.google.com/open?id=1H2PNtGKaWW1fsXL95rRt3kJBATpBqu4g"&gt;Download RxJava 2.1.12 javadoc from GoogleDrive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;About 50MB, includes all images&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Upgrade Retrofit 1.X to 2</title><link>https://jchu.cc/2016/09/05-retrofit.html</link><pubDate>Mon, 05 Sep 2016 23:51:48 +0800</pubDate><guid>https://jchu.cc/2016/09/05-retrofit.html</guid><description>&lt;p&gt;I guess most of people alreay read the post &lt;a href="https://futurestud.io/blog/retrofit-2-upgrade-guide-from-1-9"&gt;Retrofit 2 — Upgrade Guide from 1.9&lt;/a&gt;, me too. It listed some points for upgrading. If you used Retrofit 1.x in production, you might get more problem than the guide in upgrading, at least I did. Just make a memo here for myself and other poor guy.&lt;/p&gt;
&lt;p&gt;I had problems such as&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primitive String was wrapped by double quotes&lt;/li&gt;
&lt;li&gt;Upload multipart-form by using RequestBody doesn&amp;rsquo;t work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Android Studio use sdk source code</title><link>https://jchu.cc/2016/08/19-sdk.html</link><pubDate>Fri, 19 Aug 2016 11:49:49 +0800</pubDate><guid>https://jchu.cc/2016/08/19-sdk.html</guid><description>&lt;p&gt;用 Android Studio 的時候經常會用 debugger 設定 breakpoint 停下來抓蟲。step trace 的時候往往也會跳進 sdk 裡面的 code。Android Studio 會 decompile 並且找 source code 來幫助我們 trace&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android Studio 會看 build.gradle 裡面的 &lt;strong&gt;compileSdkVersion&lt;/strong&gt; 來決定開發環境用的 sdk version&lt;/li&gt;
&lt;li&gt;如果設定成 23，就會去找 &lt;strong&gt;API 23 的 source code&lt;/strong&gt;。所以要用 &lt;em&gt;Android SDK Manager&lt;/em&gt; 下載 API 23 的 source code&lt;/li&gt;
&lt;li&gt;如果是用 emulator 當開發環境，記得也要把 image 版本設定到相同的 &lt;strong&gt;API 23&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>使用 RecyclerView</title><link>https://jchu.cc/2016/03/13-recyclerview.html</link><pubDate>Sun, 13 Mar 2016 09:17:26 +0800</pubDate><guid>https://jchu.cc/2016/03/13-recyclerview.html</guid><description>&lt;p&gt;&lt;a href="http://android-developers.blogspot.tw/2015/10/android-support-library-231.html"&gt;RecyclerView&lt;/a&gt; 是個在 Google I/O 2014 出現的 ViewGroup，放在 &lt;a href="http://developer.android.com/intl/zh-tw/tools/support-library/features.html#v7"&gt;v7 support libraries&lt;/a&gt;，Android 2.1(API Level 7) 以上的版本都可以用，以現在普及率來看，幾乎是每一支手機都能用。&lt;/p&gt;
&lt;img src="https://jchu.cc/2016/03/13-recyclerview/3layout.png" alt="3layout.png" style="max-width: 800px; margin: auto;"&gt;&lt;p&gt;RecyclerView 預設就提供了三種 &lt;a href="http://developer.android.com/reference/android/support/v7/widget/RecyclerView.LayoutManager.html"&gt;LayoutManager&lt;/a&gt;，如上圖，由左而右依序是 ListLayoutManager, GridLayoutManager 與 StaggeredGridLayoutManager。都放在 v7 support libraries 裡面。&lt;/p&gt;
&lt;p&gt;看起來 List 與 Grid 已經重複了，為何 Android 還要多提供這個 Widget？&lt;/p&gt;</description></item><item><title>被攻陷的 Android 平板</title><link>https://jchu.cc/2015/10/21-crack.html</link><pubDate>Wed, 21 Oct 2015 22:03:51 +0800</pubDate><guid>https://jchu.cc/2015/10/21-crack.html</guid><description>&lt;p&gt;某天下午，我叔叔拿著他的 Android Nexus 7 平板來找我，說是不能操作了。拿來一看發現螢幕都被綁架得相當徹底。&lt;/p&gt;</description></item><item><title>實作 Android ListView</title><link>https://jchu.cc/2015/09/26-implement-listview.html</link><pubDate>Sat, 26 Sep 2015 01:24:46 +0800</pubDate><guid>https://jchu.cc/2015/09/26-implement-listview.html</guid><description>&lt;p&gt;最近在改別人留下的 Android code。&lt;/p&gt;
&lt;p&gt;好一段時間沒寫 Android 了，尤其我的記憶力又特差，經常要翻一下以前寫的程式才能回想起來某些 widget 怎麼用，ListView 就是其中一個。雖說一個功能可以有多種不同實作方式，各人又有各自常用的套招，即便 ListView 沒特別難，還是經常可以看見各種不同的寫法。&lt;/p&gt;
&lt;p&gt;原本只是要貼一些程式碼進自己的筆記 wiki 裡面，想說反正都寫一些了，不如多寫一點貼出來給有緣人當參考，雖然更多時候會是我自己一直回頭來看。&lt;/p&gt;
&lt;p&gt;用 ListView 的時機通常就是這幾種&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;把一堆字串顯示在 ListView 當中&lt;/li&gt;
&lt;li&gt;把客製化的 View 顯示在 ListView 當中&lt;/li&gt;
&lt;li&gt;提供單選 single choice 的選單&lt;/li&gt;
&lt;li&gt;提供多選 multiple choices 的選單&lt;/li&gt;
&lt;li&gt;實作客製化的 multiple choices&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;接下來針對以上常見的需求來介紹，同時也會處理 Click 事件&lt;/p&gt;</description></item></channel></rss>