2018年8月19日 星期日

[Android] GooleI/O 2018 Android App Open Source 囉~

來源:Android Dev Blog

   好啦,來說一下這個的重點,

   簡單說,這個App的源碼,可以當作一個Google本身對現代Android App的建議的具體呈現,所以如果想做類似功能或架構可參考這支App的源碼,當成小說看看也不錯 (喂~誰看的下去)


架構部分

  • Presentation Layer,邏輯確實從View(Activity/Frgamnet)移開到ViewModel,然後使用LiveData跟Data Binding關聯資料跟UI。
  • Data Layer,有Repository 處理全部的資料邏輯,處理來自不同來源的資料,包括從Firestore來的使用者資料,跟從SharedPreferences來的偏好設定資料。
  • 兩層中間還有一個Domain Layer,負責分派不同的工作邏輯處理
  • 用了Dagger2處理dependancy injection,用了Esspreso處理instrumentation test,用了 JUnit 和 Mockito 處理unit test。



Firebase部分,這支App用到以下:

  •  Firestore:處理user data,會做同步跟快取。
  • Functions: 用來跑backend code。預訂功能靠Functions去檢查使用者狀態跟空位,及在Firestore上做預訂。
  • FCM:通知App Conference資料變更用,用了ping-and-fetch model。
  • Remote Config:用來更新跟Conference資料無直接關係的資料,像是Wifi跟接駁車。(這個居然有這種用法...)

用了Kotlin+KTX寫。

用了很多Material Design元件,只是來不及用完整的Material Theming。

之後可能還會加上JetPack,當作安卓模範生展示 XD

專案GitHub在此


Hey,看看這些你有多少還沒用呢?

[Android P] 正式版囉~

來源:Android Dev BlogHK01LTNYahooNewsExtremeTechTheSun

8/6出正式,果然比前兩代早出呀...不到8/20就出了。

雖然8/6就出了,但其實目前也只有Pixel家族跟Essential PH-1能用,很多國家都買不到,就看成是一個較大規模的公測吧,其他廠商的話...

根據HK01,有Beta計畫的手機會在Q3完結前(9月底前)更新,其他肯升的大概是年底前:
"早前參加了 Android P Beta 計劃的手機,包括 Nokia 7 PlusOppo R15 ProSony Xperia XZ2Vivo X21UDVivo X21小米 Mix 2s 等,再加上一眾合資格的 Android One 裝置,將會第三季完結之前陸續收到更新。其他廠商的合資格型號手機則會在今年底之前,可望得到 Android 9 Pie 的升級。"

根據LTN,Sony已有喊話,機款跟時程都有喊,只是根據經驗Z系列升完還會升中高階的。
"SONY Mobile 除了今年旗艦機款 Xperia XZ2 可升級 Android P 9.0,此外,首波公布可支援升級的 Xperia 機型名單,包括有:XZ2 Compact(台灣未引進上市)、XZ2 PremiumXZ1XZ1 CompactXZ Premium,主要以去年、今年的旗艦機款為優先。
預計將會在 9 月至 11 月期間,陸續推送升級更新服務"

根據YahooNerws,HTC目前只有喊機款,還沒壓時間。
"宏達電在官方推特(Twitter)證實,近期將升級Android 9的4款HTC手機包括今年旗艦機HTC U12+以及去年推出的HTC U11+HTC U11HTC U11 life(Android One版本),實際升級時間將另行公布。"
根據TheSun,Moto也有喊機種,時間壓秋天(9~11月),
"In mid-August, Motorola confirmed that it would be serving up some delicious Android Pie on the following phones this autumn:
Moto Z3
Moto Z3 Play
Moto Z2 Force Edition
Moto Z2 Play
Moto X4
Moto G6 Plus
Moto G6
Moto G6 Play
"
好啦,Samsung、LG、Huawei都沒喊聲,只是依慣例,最新旗艦肯定會升。

看今年何時可以在台灣買到有Android 9的手機囉~|


另外,App devs如果還有沒測完9的就加油好好測吧...沒有Pixel家族就用Emulator囉~

話說,今年Pixel家族應該會在台灣開賣吧...只是日期還沒出來呀..



2018年7月27日 星期五

[Android P] Final Preview,最終測試版囉~

來源:Dev Android

摘要:
這版是Beta 4,應該也就是Developer Preview 5 (DP5),

最終行為變更版囉,API也沒變喔,跟Beta2(DP3)時一樣;
要測要改的要快喔!

要改的改完了,行有餘力可以試試P的新程式功能。


心得:

  • DP5了,還是不知P是啥甜點?
  • DP5了,App dev們有認真在測嗎?
  • DP5了,照raod map上距離正式出版那麼近的距離,不知正是會不會早出,
    還是跟前兩代一樣8/21、或8/22出?
  • 我的手機不知能不能升到P呀? 雖然有升到O,用Treble的測試App也說有支援Treble,應該有機會吧..

2018年7月25日 星期三

[Android] 2018/7月份 版本分布

參考:Android dashboards


  1. 最重要的,API22+破82%了,如果有新App要做,可以考慮min用22(5.1)了。
  2. API21+破86%了,MIN真不能用22+的就用21+吧 XD
  3. OREO(8.X)升為12.1%,出現在榜單10個月。
  4. 牛軋糖(7.X)+為42.9%,出現在榜單已21個月了...
  5. API24(7.0)以下全部下降。
  6. API25(7.1)以上持續上升。
  7. 還有4.1%的使用中裝置不能玩PMGO跟熊大農場。


上個月股哥沒公布,不是我偷懶沒PO喔..

另一個Dev會遇到的就是尺寸問題:
ldp還有0.3%(↓)、mdpi還有4.7(↓)%、最大比例在xhdpi 41.5%(↑)(所以如果想偷懶只放一份資源...嗯)

2018年5月24日 星期四

[Android] Google Cardboard VR

Google Cardbord雖然很早就出了(Android 4.4以上可用),但我之前都沒試過,倒是HTC Vive有試過;最近買了個最便宜的紙盒來玩。

嗯...效果果然比HTC Vive差不意外。

實際體驗發現有以下缺點,就知為何要有更高階的VR。


  • 可視範圍小,可清楚看的範圍更小。
  • 手機很重,不用手扶光靠頭帶會歪。
  • 戴眼鏡看會無法貼合,但盒子設計本來就不太貼臉。
  • 然後可能會沾到臉上的油,所以要用久一點要洗臉完才能用。(不過這各家都一樣,只是紙板吸油看的到 XD)
  • 不知如何操控;用Google Cardboard的官方App說"Press the Button",但我盒子上沒按鈕可按呀..查了一下Cardbord 2代才有按鈕,1代Carboard是靠撥磁鐵,可參考知乎這篇
  • 看完眼睛有點不舒服,對焦出問題的感覺。
  • 另外,距離看時手機點還是很大,看來再換更高密度的手機之前,我應該不用再買手機型VR頭盔了。給個比較,我的手機(Sharp S2)密度是420ppi,VIVE是448ppi、Oculus Rift是456ppi、VIVE pro是615ppi。我之前用VIVE時也是覺得點有點大,所以手機的點更大,如果有450ppi以上的手機的人,應該可以試試。
  • 鏡片跟左右眼隔板容易脫位。
  • 鏡片容易沾塵變髒,帶頭盔看灰塵會很明顯(只是這應該也是各家都一樣)。
  • 坐著很難轉圈看360度,還是要站著用較方便(只是這應該也是各家都一樣)。
目前只有試用Google官方寫的App,包括:
下次看要買2代設計的頭套(非紙盒),還是要買獨立(Stand alone)VR裝置呢?
就先試用看看現有App吧~

只是PLAY Award的Best VR App都是Daydream的,一般Carboard手機不能用 Q_Q..


2018年5月9日 星期三

[Android] 2018/5月份 版本分布

參考:Android dashboards


  1. 最重要的,API21+破84%了,如果有新App要做,可以考慮min用21(5.0)了,因為5.0才開始原生支援Material Design呀....還有JobScheduler呀...
  2. API19+破95%了,MIN真不能用21+的就用19+吧 XD
  3. OREO(8.X)升為5.7%,出現在榜單8個月。
  4. 牛軋糖(7.X)+為36.8%,出現在榜單已19個月了...
  5. API24(7.0)以下全部下降。
  6. API25(7.1)以上持續上升。
  7. 還有5%的使用中裝置不能玩PMGO跟熊大農場。


另一個Dev會遇到的就是尺寸問題:
ldp還有0.4%、mdpi還有5.1%、最大比例在xhdpi 40.5%(所以如果想偷懶只放一份資源...嗯)

2018年4月18日 星期三

[Android] 2018/4月份 版本分布

參考:Android dashboards



  1. 最重要的,API21+破84%了,如果有新App要做,可以考慮min用21(5.0)了,因為5.0才開始原生支援Material Design呀....還有JobScheduler呀...
  2. 另外,API18+破95%了,只是API19+也有94.8%,MIN真不能用21+的就用19+吧 XD
  3. OREO(8.X)升為4.6%,出現在榜單7個月。
  4. 牛軋糖(7.X)+破35%,出現在榜單已18個月了...
  5. 棉花糖(6.X)以下全部下降。
  6. 牛軋糖(7.X)以上持續上升。
  7. 還有5.2%的使用中裝置不能玩PMGO跟熊大農場。

上個月股哥沒公布,不是我偷懶沒PO喔..

另一個Dev會遇到的就是尺寸問題:
ldp還有0.4%、mdpi還有5.2%、最大比例在xhdpi 40.6%(所以如果只想放偷懶放一份資源...嗯)



其實我比較想各裝置寬高多少dp的統計,刻多dimen會用到,但...官方沒提供,看來只能自己統計囉..
法1:找銷售前10名的型號,跑測試程式看寬、高(W、H)各多少dp。
法2:自己的App埋統計回傳(Analytics) 高寬(W、H) dp數,如果App夠熱門,應該樣本不少。
法3:不管dp數,我就是要用px,那熱門機px就很好查了.

2018年3月28日 星期三

[Android] ARCore下批可能支援的手機

來源:Android Police

摘要:
新的ARCore App被拆包看,發現多了很多裝置代碼,可能是之後會支援的;
包括:Huawei的一些手機、Samsung的一些手機、Moto跟Xiaomi的一些手機。就是越來越多隻的意思。只是目前還不支援。

心得:
Google的ARCore只支援某些高階機,這次新的名單裡有比較中階的Samsung A5/A7,對捨不得花大錢的人是好消息吧...只是A5(2017)都下市了,也太舊...真希望有台灣可買到的中階手機支援呀...好多AR App不能玩 QQ
另外,Android P裡面應該直接塞ARCore呀...


[Android] Migrating Apps to Android P

來源:Dev Android

摘要:
Google教你怎麼測你的App在Android P是正常的~

-第一階段:現有App不改先在P測,可參考Google的品質測試Guideline,及Table 1的主要變更項目。

-第二階段:targetSdkVersion 指到P,參考這篇 還有Table 2看要測啥改啥。

一二階段都測完就能(稍微)安心了,耶~


心得:
每一版Android都改不少呢,之前有想過看兩版差異報告,多到會吐血,看不下去,現在Google比較好了,會出行為變更整理,這次還出搬遷指導。

DP1三月已出,DP2五月出....DP5七月出,正式版Q3出,如果是8.0前的Android,其實從正式出在測應該還來的及,因為廠商至少要一個月客製化 (除了Google親兒子)。

但8.0 Oreo後,因為Project Treble,有可能升版速度會變快,就是這次9.0(P)就可知道Project Treble到底有沒有用囉~雖然他方向是對的,可是不是每個OEM廠商都有把每台8.X裝置加進去;但如果要保險起見,還是從DP4開始測吧~

[Firebase] Crashlytics已成為Firebase正式的Crash Reporter

來源:Google Dev Blog

摘要:
Crashlytics是Creash Reporter SDK第一名,有很多好功能,加入Firebase後功能多更多,3/19時已BETA完變正式囉~ 有以下重點:
-整合GA,做出麵包屑(Breadcrumbs)功能,讓你方便追user行為。
-有Crash insights,建議你這問題可能的原因跟解法。
-可以固定住最重視的版本,方便查看。
-有dSYM(XCode編iOS的一個對應檔)上傳工具。
-成為Firebase的預設崩潰報告,Firebase Crash Reporting只會活到9/28,有用快轉喔。
-有Fabric跟FrieBase的連結工具,兩個都有用可以連一下;只有用Fabric就還要等一下轉換工具。


心得:
Fabric Crashlytic的華麗報告畫面不知會不會變成Google的Material Design畫面?
Fabric的其他服務(eg. Answers)不知還會不會活著?
Google整合服務真的很快耶....不像之前某Y公司都買來放著。

[Cross-platform] 用Flutter也可做出跨平台百萬下載,評分4.3+的App

來源:Google Dev Blog

摘要:
設計公司POSSEFlutter做了Hamilton的App(iOSAndroid),然後下載量超過一百萬,還有50萬以上活躍用戶,只要寫一次就可以賣兩邊,真是好棒棒,快來用Flutter吧~


心得:
之前聽過的跨平台方案都有缺點,整個開發體驗不如原生方案美好;而且針對官方OS、SDK、Design Guideline更新都可能會卡關,要找通用的輪子(別人寫好的元件)也較難。

只是我只試用過AIR、PhoneGap跟React Native,Xamarin沒試過。

AIR是很早期的Adobe行動解決方案,用Flex開發,現在應該沒人用了,因為要有runtime才能跑。

PhoneGap系列不用說,網頁就是慢。所以後來的跨平台才會都說要編成Native;

但React Native的開發環境跟Android原生開發體驗差很多,很像在開發網頁(用JSX),應該蠻適合React或Node工程師轉行或兼職用。

Xamarin用的是C#,如果是C#工程師轉行應該不錯,只是聲勢目前低於React Native就是。

Flutter用的語言是Dart,一個用的人不算多的語言,但是相對Obj-C或JSX,對寫Java或C++的人來說應該好懂很多,至於為什麼用Dart,可看這篇。然後他號稱比ReactNative不容易遇到效能瓶頸,而且又有提供兩平台的UI元件(當然要兩邊符合設計要分開做啦)

至於Xamarin vs. React Native vs. Flutter,可以看這篇

只是如果叫我三選一,我應該會說...可不可以讓我只寫Android,好啦,應該會先試試看Flutter吧..畢竟IDE跟AS比較像,語法對Java工程師又比較容易懂。

[Android] Android Studio 3.1 Stable

來源:Android Dev Blog

摘要:
Android Studio3.1出囉,支援更新的工具跟語法、跑得更快、提供更多好用工具,簡直好棒棒,快來更新吧~

心得:
看完文章跟影片,真的會覺得好棒棒,但還是有人反應App會跑不起來的問題,就目前沒時間蒐集災情跟測試,等有空再來試試囉~

[Android] Play商店會根據你的裝置推薦你完整版或Lite版App

來源:Android Police

摘要:
Play商店會根據你的裝置推薦你完整版或Lite版App (eg.FB & FB Lite)。

心得:
雖然不知怎麼做到的,可能是上架時要做些設定,但在台灣跟美國應該沒有那麼差的手機,不能跑完整版FB的。

如果真的要照顧低階手機的users,可以去買Android Go版手機來當測試機囉~
畢竟Google說Go是為了另一批十億users做的,啊...只是要去拍賣找找看了,因為應該不會在已開發國家賣..

2018年3月27日 星期二

[Android] 無Google認證裝置不能用Google服務囉~

摘要: 3/16後出來的ROM,沒經過Google認證就不能用Google服務跟Google Apps囉~ 除非註冊該台的AndroidID 心得: 之後刷第三方ROM的手機跟大陸機 要裝PLAY服務難度又變高囉... 話說我只刷過官方ROM過...因為都不是買熱門旗艦機,沒啥客製ROM能選 XD

2018年3月26日 星期一

[Android] ScrollView包SwipeRefreshLayout包RecyclerView完全沒有畫面(RecyclerView does not show in SwipeRefreshLayout)

問題:
因為RecyclerView做的List上面還要放一些固定的東西,但為了小螢幕手機只好用ScrollView包起來,但為了下拉刷新只好加上SwipeRefreshLayout;
就是ScrollView包SwipeRefreshLayout包RecyclerView,然後...RecyclerView就不秀了,怎麼辦呀?

參考:StackOverflowCSDNivankocijan.xyzCSDN珞璃之神

說明:
根據StackOverflow可知,SwipeRefreshLayout外面不能有ScrollView,那就反過來包;SwipeRefreshLayout包ScrollView,這樣就會秀囉。

只是這樣有幾個問題:

  1. 轉圈(progress view)不在List上方,而是在ScrollView上方。
    =>在意的話,只能改成最外面不是SwipeRefreshLayout,而是CoordinatorLayout,參考CSDN珞璃之神
  2. SwipeRefreshLayout會吃ScrollView手勢。
    =>可以判斷List到頭才啟用SwipeRefreshLayout,可參考CSDN

好啦,如果2這做法SwipeRefreshLayout包ScrollView包RecyclerView大致沒問題,只是如果把ScrollView改為NestedScrollView,下面的RecyclerView做的List會全展開,如果想限制項目數,只能自己在程式裡設定高度了。


手機螢幕高度不夠用問題真的很難解,所以Material Design才會用CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout等元件,讓畫面上方有些東西可以在捲動時縮起來,設計畫面時可參考看看囉。


另外,在查資料時發現NestedScrollView在舊版v4包有很多問題,這篇在用v4:27.1.0時已經沒那些問題了。

2018年3月22日 星期四

[Android] 禁止EditText跳出選單 (EditText disable popup menu )

問題:
我有一個EditText希望點文字不要跳出 [剪下(cut)/複製(copy)/貼上(paste)/分享(share)]選單,官方沒有提供設定介面耶,該怎麼辦?

參考:StackOverflow簡書CSDN

說明:
這個問題網路上查到有以下解,但是不同Android版本效果不同,所以我有針對Android 5.0、6.0、7.1、8.1做測試,就來看看吧~


  1. android:longClickable="false" → 5.0+就沒用了,照樣可選 (據說3.1+就沒用了)。
  2. android:textIsSelectable="false" → 5.0+就沒用了,照樣可選。
  3. setCustomSelectionActionModeCallback設定自己改寫的 → 5.0+就沒用了,照樣可選。
  4. setOnTouchListener針對ACTION_DOWN不做事 → 6.0+才有用。
  5. 繼承EditText改寫isSuggestionsEnabled跟canPaste(參考StackOverflow) → 5.0~8.1都不會跳出全選的選單,但是點擊游標下方的小水滴(text select handle)還是會有貼上(paste)選單。
  6. 自訂textSelectHandle(有單、左、右三個)為長寬0dp的矩形(參考StackOverflow) → 5.0~8.1都沒小水滴了,但全選時還是會跳選單。
  7. 把EditText的mEditor抓出,把Insert handle跟Select handle關掉(參考簡書) → 5.0~8.1都有用。


其中,5有點危險,因為有改寫一個non-public method canPaste,如果Google改名就沒用了;
然後7更危險,還會被Android Studio警告,因為有用名稱抓內部資源,如果Google改名就沒用了,沒防呆還會當。

但是如果不用5或7似乎真的沒解。

所以...我是推薦用3+5+6,詳細就參考StackOverflow吧。


2018年2月21日 星期三

[Android] 離開App寫法 (Quit App)

問題:我想在Android App裡寫個離開(exit/ quit)功能,該怎麼寫呢?

參考:掘金1掘金2CSDNStackOver1龍崗山上的倉鼠StackOverflow2StackOverflow3DevAndroid1DevAndroid2DevAndroid3DevAndroid4

說明:
首先,Google不建議開發者自己殺掉整個App Process,而是交由系統處理,只要畫面全部finish()即可,而且有在各畫面的onDestroy()處理掉該處裡的東西(Thread、Handler、interface...),這樣gc在整理時應該會順利清除。
甚至建議開發者不要在App裡加離開按鈕。

看來真有人照做,我看LINE、FB、FB Messenger都是在Root Activity(最下層的)時再按返回,就回到桌面,但其實process沒死,點icon再開,不會從啟動畫面(splash screen)進去。但如果從多工鍵(Overview Button)進去滑掉他的Task(這才真的殺掉process),下次就會重啟。

另外,Play商店、GMail、YouTube不管有沒有滑掉,離開再點icon都是從同樣畫面進去,只是這三隻也都沒離開鈕,都是在Root Activity時再按返回,就回到桌面了。


但是,Dev是每個都那麼強嗎?不會少處理造成MemoryLeak而無法回收嗎?
或是說工程師的潔癖就是不要留太多垃圾等打掃阿姨(GC)來收呀 XD

如果,你不聽Google言,一定要做Quit App,就看掘金1掘金2這兩篇選個方法做吧
裡面方法實在太多種了:

簡單說,殺掉process的方式有以下兩種,效果看來一樣..
System.exit(0); 跟 android.os.Process.killProcess(android.os.Process.myPid());
只是在做這件事之前,你要先把Activities關閉,才不會造成重啟。

所以啦,

  • 如果你的Quit()寫在RootActivity,或只有一個Activity,只要把自己finish()然後再exit(0),就好了。
  • 如果你的Quit()寫在非RootActivity也可調用,那你就finish()所有Activities,然後再exit(0)吧。這方法很多,以下推幾種:
    如果你min=API 21+,可以用finishAndRemoveTask();
    如果你min=16+且只有一個Task,可以用finishAffinity();
    如果你min<16或有多個Tasks,那可用List保存Activities法。




2018年2月20日 星期二

[Android] OkHttp3 TLS 1.2 連線寫法

問題:我有WebService連線要用 TLS1.2,那用OkHttp要怎麼寫呢?

參考:OkHttp WikiOkHttp IssuesDevAreaDevAndroid-SSLSocketDevAndroid-SSLContext

說明:
根據DevAndroid-SSLSocket的表格,API16+可支援TLS1.2但不是預設,到API20+才是,那這是甚麼意思呢?

就是說:
  • 你Build.VERSION.SDK_INT<16就完全不能用TLS1.2。
  • 你Build.VERSION.SDK_INT是16~19可以用,但要多寫一些code。
  • 你Build.VERSION.SDK_INT>=20可以用,而且不用多寫code。
有沒有覺得MIN>20好棒呀 XD

那<16的支援方式我就不管了,畢竟現在2018了,新專案還要MIN 15也太低了..


那16~19的寫法簡單說,
  1. 要extends SSLSocketFactory寫一個處理TLS的Factory,叫Tls12SocketFactory 好了,可看OkHttp IssuesDevArea的寫法

  2. 針對Build.VERSION.SDK_INT16~19的要多做以下:
    Tls12SocketFactory tlsSocketFactory = new Tls12SocketFactory(sc.getSocketFactory());
    client.sslSocketFactory(tlsSocketFactory , Platform.get().trustManager(tlsSocketFactory));

    OkHttp Issues中,的client.sslSocketFactory只有第1個參數的寫法已經deprecated了,還是要有第2參數X509TrustManager,可從Factory中取出。

  3. client要再設啥connectionSpecs可再設。
而20+的寫法就是少掉第1、2點即可。


其他關於OkHttp的HTTPS設定,可看OkHttp Wiki



2018年2月6日 星期二

[Android] 2018/2月份 版本分布





  1. 最重要的,API21+破82%了,如果有新App要做,可以考慮min用21(5.0)了,因為5.0才開始原生支援Material Design呀....還有JobScheduler呀...
  2. 另外,API18+破95%了,只是API19+也有94.3%,MIN真不能用21+的就用19+吧 XD
  3. OREO(8.X)升為1.1%,出現在榜單5個月。
  4. 牛軋糖(7.X)+破29%,出現在榜單已16個月了...
  5. 棉花糖(6.X)以下全部下降。
  6. 牛軋糖(7.X)以上持續上升。
  7. 還有5.7%的使用中裝置不能玩PMGO熊大農場



話說,旅行青蛙(旅かえる)只要16+(Android 4.1)就能跑,真的有那麼舊的機器測嗎?

[Android] WebService處理

問題:
我想在App裡處理WebService,跟主機發Http Request(Get/Post),等Response回來,然後parse完結果,秀在UI上,發現有好多工具套件,該怎麼選?

參考:
比較:QuorastromzhangStackOverflow1PacketZoomMediumGetIt01黑客派
分析:SmashingMagzine簡書
教學:CSDN1泡在網上的日子JournalDev綠豆湯DevAndroid1bng86DevAndroid2
GitHub:okHttpVolleyRetrofit

說明:這題有幾個部分要處理喔~

  1. App跟Http主機溝通的元件
  2. UI端跟Http處理元件的溝通
  3. 解析Response回來的結果
這篇就只講"1.App跟Http主機溝通的元件",不然太長了..

先說結論:選OkHttp,如果不喜歡包OkHttp,那就用Volley,完全不喜歡第三方包就HttpURLConnection。

看網路找的結果現在大概會有以下選擇:
  • HttpURLConnection:官方內建元件。
  • OkHttp:Square社製作,網路上大推的元件。
  • Volley:Google社製作,網路上大推的元件。
  • Retorfit:Square社製作,網路上大推的元件。
其實這4個只有前2個是真的Http處理元件,後2個是包裝簡化使用的結果,

如果很早就在寫Android的朋友應該有用過apache的HttpClient,只是它在Android 6.0(API 23)被移除了,所以還在用org.apache.http.legacy的朋友應該可以考慮轉OkHttp,因為Square有做OkHttp Apache HttpClient Implementation,可以減少轉換痛苦。

[更新] HttpClientURLConnection的實作都被OkHttp廢棄(deprecated)了,用舊版應該是可,只是若有BUG沒人修了,原本用法可參考:HttpClient用OKURLConnection用OK
建議使用純okhttp3的寫法囉~

如果喜歡用Volley的,底層連接也可改用okHttp已增進效能,參考簡書這篇,只是看來有點煩。

OkHttp大致上
好處:
壞處:
  • 需額外引入com.squareup.okhttp3:okhttp



複雜的都不想說,有疑問可看參考。

再說一次結論:選OkHttp,如果不喜歡包OkHttp,那就用Volley,完全不喜歡第三方包就HttpURLConnection。

Retorfit的話,建議先用過OkHttp再用會比較理解囉

當然,這四種選哪種都很好查到範例跟資源啦...
而且都能完成GET/POST/HTTPS/憑證綁定(certificate pinning) 等工作...吧 XD

2018年2月5日 星期一

[Android] RecyclerView 分隔線(divider)製作

問題:用RecyclerView做了一個垂直List,但每項中間要加分隔線,要怎麼做?

參考:
DividerItemDecoration法:DevAndroid簡書1StackOverflow1
自己寫ItemDecoration法:StackOverflow2簡書2
拿別人寫好的來用:GitHub1GitHub2GitHub3 (太多,只寫三個,第一個是看簡書有人推的,後兩個是GitHub超過500★的)

說明:
在RecyclerView裡設分隔線的正途是addItemDecoration,在項目的小View Layout裡做分隔線是邪道(雖然比較簡單 XD)

  • 好啦,那之前都要自己繼承ItemDecoration寫實做,有點難懂,但SupportLibV7 25版後加了DividerItemDecoration,如果用API 25版後編App,可以先用這個試試,詳細用法參考DevAndroid簡書1
  • 如果上面的效果不太理想,或自己編版SDK太舊,或想要更活,就自己寫或用別人寫好的ItemDecoration囉~

嘛...我自己試的結果是,用shape當drawable給DividerItemDecoration,粗細跟顏色都能調,只是會加到最後一個item的下方還有線,如果要解這問題,就要自己實作ItemDecoration了(參考StackOverflow2),如不在意那就OK。

[Android] RecyclerView OnItemClick實作

問題:
我想用RecyclerView來做List點項目開新頁,但是沒有內建項目點擊(OnItemClick)事件,怎辦?

參考:
多方法比較派:30Sparks掘金
OnClickListener派:Little RobotsAndroidPubStackOverflowCSDN1CSDN2冰封承諾CSDN3
OnItemTouchListener派:segmentfault木楊

說明:
從參考資料看來,處理點擊項目分為兩大派:OnClickListener派、跟OnItemTouchListener,


OnClickListener派 ─ 寫法比較簡單,但是其中又分好幾支派:
  • 整個RecyclerView傳進一個Support Class處理,在onChildViewAttachedToWindow時加上OnClickLisener,詳見Little Robots
  • 在onBindLoopViewHolder時加上OnClickLisener,最常見的簡單作法,詳見StackOverflowCSDN3
  • 在onCreateViewHolder時加上OnClickLisener,通常是怕Bind觸發太多次,在那處理效能會變低,詳見冰封承諾
  • 在ViewHolder的Constructor(建構子)裡加上OnClickLisener,理由跟上面一樣,而且code在ViewHodler看起來Adapter裡的code會少一點,詳見AndroidPubCSDN1CSDN2


OnItemTouchListener派 ─ 寫法比較複雜,但是會覺得自己用官方介面比較厲害(誤)。

只是這方法要寫兩個class,一個繼承OnItemTouchListener處理項目觸碰事件、另一個繼承SimpleOnGestureListener分析觸碰的手勢是不是點擊(Click),詳見segmentfault木楊


這幾種方法的話,
我還是比較偏好在ViewHolder的Constructor(建構子)裡加上OnClickLisener,因為簡單;
如果要重複使用那我推薦Little Robots的方案


其中,ItemClick事件的傳遞大部分都用interface傳到外面的Fragment或是Activity,只是也找到用RxJava傳的方法,但RxJava這裡還沒寫到,就先跳過囉,有興趣自己Google相關範例。

[Android] ListView vs RecyclerView 垂直單欄簡單表單

問題:
我要做一個垂直的單欄表單,點項目開新頁,該用ListView 還是 RecyclerView做比較好?

參考:DevAndroidAndroidPub簡書StackOverflow1StackOverflow2

說明:

結論先說,RecyclerView是大家都推的方式,雖然有些缺點且較使用複雜,但都可解。但是如果學習時間不夠或不想學習,就用ListView吧...

綜合參考來源,用RecyclerView,只考慮做垂直的單欄表單 (Vertical single column list)的優缺點分列如下:

優(Pros):

  • 強制要求用ViewHolder提高效能,ListView要自己做。
  • 可用DiffUtil做資料集差異更新,ListView要自己做。
  • 內建指定位置項目更新notifyItemChanged,ListView要自己做。
  • 內建局部更新動畫setItemAnimator,ListView要自己做。

缺(Cons):

  • 學習難度較高,因為太活了,要設定較多 = =;。
  • 沒有內建onItemClickListener,RecyclerView要自己做(這個真的希望內建呀..)
  • 沒有內建頭尾項目 HeaderView、FooterView,RecyclerView要自己做。
  • 沒有內建無資料畫面setEmptyView,RecyclerView要自己做。
  • 分隔線(divider)製作較複雜,RecyclerView官方正途方法要用ItemDecoration。
  • 要加入v7包recyclerview項目,如果很討厭引用的話 XD

當然,其他很多人提到的是RecyclerView跟Layout分開,可做直的(Vertical)、橫的(Horizontal)、格子的(Grid)、不對齊的格子(StaggeredGrid),但是太活也是個問題呀 XD
一般同一資料集只會用一種,除非可設定版面變換的。

結論再說一次,RecyclerView是未來寫Android一定會用到的元件,所以能學的時候就學吧,但是拿來做簡單ListView又太麻煩,時間不允許就繼續用ListView,或是上網找找有沒有用RecyclerView做出ListView所有功能實作的包裝範例囉~

關於項目點擊分隔線實作,應該會另外寫一篇,不然太長囉~

2018年1月25日 星期四

[Android] 監控網路連線狀態(Monitoring network connectivity status)

問題:
我的App想加入網路監控,當無法連線時要跳通知,連上線後通知要消失,要怎麼做比較好呢?

處理:Google 「android 網路連線偵測」 → Google 「android internet connection detect」

參考:
[網路(Network)偵測區]
DevAndroid-DetermineAndMonitorDevAndroid-isConnectedOrConnectingCSDN-isConnected_vs_isAvailableStackOverflow-isConnectedAlwaysFalseStackOverflow-isConnectedAlwayTrue
[網際網路(Internet)偵測區]
StackOverflow-NoInternetStackOverflow-PingHost
[監控(Monitor)及通知(Notify)前端區]
StackOverflow-PhoneStateListenerGadgetSaint-BroadcastReceiverMILKMIDI BLOG-BroadcastReceiverCC's 程式碼-BroadcatReceiver
[跳轉設定(Settings)]
簡書

說明:
這題可以分成幾部分:
  1. 如何確定有無網路?
  2. 如何偵測網路連線狀態改變且通知畫面端?
  3. 畫面端要怎麼處理?

其中,"1.如何確定有無網路?"

  • 有用"ConnectivityManager"跟"TelephonyManager"兩種方法,看DevAndroid推薦的是ConnectivityManager,大部分網友也是用這種,所以就只看這種。

  • ConnectivityManager裡面又有用isAvailable、isConnected、isConnectedOrConnecting、getState 這4種判斷是否連線,getState要自己寫判斷式就先跳過,另外三種只有isConnected是確定連上網路的,但看來有些機器會遇到問題誤判,所以用isConnectedOrConnecting

  • 那這樣就真的能跟主機連線了嗎?不一定,搞不好連到的網路其實不能連到你的主機或是網際網路,那怎辦? 用StackOverflow裡查到的法1 或 法2,在確定有網路連線後,連到特定站台(如果要確定自己站台可以,可以在自己站台放個小檔或測網用API),看是否會通,如果連的不是自己的站要小心,有些站台在特定國家連不到(像是Google在中國)

好了,接著"2.如何偵測網路連線狀態改變且通知畫面端?",

  • 有用"PhoneStateListener"跟"BroadcastReceiver"兩種,因為第1題選了ConnectivityManager,而且看DevAndroid跟大部分網友都是用BroadcastReceiver,所以就只看這種囉。

  • BroadcastReceiver的寫法跟用法可參考GadgetSaint 或 CC's 程式碼,注意喔,這兩個寫的通知畫面端方法不同,GadgetSaint用的是Listener(interface),CC用的是寫inner class 的Receiver(就可以在onReceive裡面處理Activity的東東);兩種寫法都記得在Activity裡registerReceiver,才能收到通知。

  • 如果不需要即時監控變化的話,也有些Dev是寫在每個Activity的onCreate測一次,或是每次連線前測一次而已,那就不用用到BroacastReceiver,只是要注意有沒有地方沒防呆該擋沒擋。
[更新] 
如果你的Target API在24以上(新專案應該都是了吧),然後在AndroidManifest裡加上<recevicer>裡面intent-filter是<action android:name = "android.net.conn.CONNECTIVITY_CHANGE" />的話,Android Studio會跳警告,說明在manifest註冊的CONNECTIVITY_CHANGE將不會收到通知,所以要不用在manifest裡加這個,在要用的Activity再註冊即可,可參考CC's程式碼,如果不想寫inner class的Receiver,那就加上interface,onReceive時用interface通知外面吧。

Android官方的建議是:參考這篇,用 JobScheduler(如果min>=21) 或 GcmNetworkManager,只是還沒時間研究,因為GCM的網頁又說請用FCM(無言,很多官網文章也不會即時更新的),所以min<21,就呵呵,反正單Activity註冊Receiver還能用,先這樣吧,有空研究再更新 。

接下來,"3.畫面端要怎麼處理?",看看其他Apps怎麼處理囉~
  • YouTube是在BottomBar下方,長出一個小View顯示網路狀態,且中間Fragment內容會變成無網路圖。

  • GMail是出現一個Snackbar顯示"未連線",Action是"重試"。

  • Facebook是出現一個Snackbar顯示"目前無法連線。",Action是"更多",點了"更多"是會問你要不要到"設定"。(可參考簡書做法)

  • Line是在Fragment上方呈現一個半透明小View,顯示"未連接至網路",右邊有個"x"可以關閉該通知。

  • PLAY是整個畫面呈現"沒有網際網路連線。請確定Wi-Fi行動數據已開啟,然後再試一次。",中間有個按鈕[重試],點Wi-Fi會到WiFi設定,點行動數據會到可用的網路設定。
可以看出大部分知名Apps都是採用持續監控網路狀態,且離線還是能進App操作,只是限制部分功能。

2018年1月22日 星期一

[Android] ImageView Out Of Memory Error

問題:
我要用App載入一些Full HD(1920*1080)的圖,結果跑的時候閃退了,OutOfMemoryError (OOM),怎辦? 我的手機有4G RAM耶,為什麼記憶體會用完?

處理:Google 「ImageView Out Of Memory」

參考:DevAndroid-largeHeap知乎壹讀DevAndroid-largeBitmap簡書CSDN

說明:
如果因為OOM閃退,就是記憶體用完了,在Android記憶體給每隻App是有限的,不會用到全部的RAM。

而每支手機配給App的HeapSize不同,要看手機的/system/build.prop檔,有很多App可檢視這檔(但不要亂改較好);以4G手機來說,標準的Heap是256M、如果你用了android:largeHeap=true,會變成給512M,但Google跟大部分Dev都不推薦用這招解決OOM問題,還是減少Memory使用才是正途。

所以啦,用以下方法吧:

  1. 想自己寫的話,用ImageFactory載入Res裡的圖,而且縮成要用的大小,顏色不講究也可改不一定用ARGB8888,可以改用RGB565,載完的Bitmap再來給ImageView用,詳見Google教學
  2. 不排斥用第三方包的話,可以用Picasso(Square主導)、Glide(Google主導)、Fresco(FB主導) 其中一個,比較文可看簡書CSDN,講結論就是:一般App用Glide、大圖超多的用Fresco、不喜歡Google跟FB的用Picasso。當然這三個除了載大圖功能還有其他功能,包括反覆載入、從網載入、從檔載入、生命週期及錯誤防呆 等優化,就看有沒有用到囉~


2018年1月16日 星期二

[Android] BottomBar遮住中間容器的內容,怎辦?

問題:
我用CoordinatorLayout包住Toolbar、FrameLayout、BottomNavigationView,但是我不想讓上下這2個bar根據捲動在那伸縮隱藏,而是要固定顯示,中間的FrameLayout我要拿來換Fragment,但是FrameLayout下方被Bottombar遮住了,無法完整顯示,怎辦?

處理:
Google「BottomNavigationView CoordinatorLayout」→ Google「BottomNavigationView 」

參考:StackOverflow1StackOverflow2StackOverflow3知乎CSDN

說明:
首先先說一下,CoordinatorLayout是拿來裝什麼的?
就是裝會伸縮滑動的原件,像是Toolbar、FAB、Snackbar等。

  1. 如果想做伸縮:目前Android官方的BottomNavigationView還不支援伸縮,所以官方範例也沒有裝在CoordinatorLayout裡面,真要做會伸縮的BottomBar只有用第三方,或是套用別人做好的BottomNavigationBehavior,可參考StackOverflow2,或是我之前po的這篇

  2.  如果想做固定:簡單說Bottombar不要在包CoordinatorLayout裡,用其他LinearLayout或RelativeLayout裝吧,看參考來源都是這樣;如果Toolbar跟BottomBar都想固定,但是想有要SnackBar功能在BottomBar上方,那就...用CoordinatorLayout包住中間的FrameLayout就好。

  3. 如果想根據設定,決定要捲不捲:哈,也許第三方包有,我沒找;我想出的辦法是...1:根據設定決定外部容器(讀不同layout)、2:外面都是CoordinatorLayout,但根據設定決定內容的margin、3:根據設定動態決定BottomBar要加到哪個容器。

話說,真的希望官方把BottomNavigationBehavior做進去元件呀...

[Android] Fragment用add加入後,Actvity重建時發生神奇疊圖事件,怎辦?

問題:
決定挑戰add加Fragment,結果在旋轉畫面後跟Activity被回收後,發現容器裡2個Fragment疊在一起了,怎辦呀?

處理:Google 「Fragment 重疊」

參考:CSDN簡書1簡書2腳本之家

說明:
會發生Fragments重疊的情況,一定是用add,而且加過2個Fragment或以上,然後發生了Activity重建的事件(會跑到onSaveInstanceState > onCreate)。

原因在於沒記住Fragment hidden狀態下又重建重加,就蓋囉~

解法有好幾種,可看參考,我的作法是

  • 融合CSDN的設定轉向不重建Activity(android:configChanges)
  • 加上腳本之家的存取目前頁面index,存的地方也是onSaveInstanceState,只是我讀的地方是onCreate,避免onCreate處理完onRestoreInstanceState又處理一次。
  • 用index去FragmentManager裡先找看有沒有加過,沒有才根據index新建Fragment。再看這fragment的isAdded()來決定要add還是要show。


2018年1月15日 星期一

[Android] Fragment 更換,該用add,還是replace呢?

問題:
我有個主頁面,想根據選單變更裡面的Fragment,發現有兩種換fragment的方法,該用哪種呢?

處理:Google 「fragment add replace」

參考:泡在網上的日子幫庫編程StackOverflowAndroid Advenced

說明:主要是看需求...兩個都能達成對方的行為,只是要注意寫法

  1. 用add換的話,容器裡有多個frgments,要自己注意寫hide/show事件很煩、要自己處理frgment疊圖事件很煩、要從fragmentManager裡找出來避免重複加很煩,那到底有啥好處?
    =>不會跑全部生命週期,秀過一次再秀較快,也會保留之前狀態,適合幾個會切換的fragments組合。
     
  2. 用replace換的話,容器裡只有一個fragment,寫法較簡單,一開始碰fragment不想花時解add問題的,就用replace吧;
    =>只是它每次會跑fragment的全部生命週期,所以重複換頁較add慢一點(慢多少看你生命週期做多少事),要回復之前狀態要自己寫。

上面有個重點:「生命週期 (life cycle)」,如果要在Fragment的特定生命週期做事,且確保用的方法是符合需求的,有跑到該跑的週期,沒跑到不該跑的程式。

至於哪些會跑到哪些不會跑到,因為case很多,就參考Android Advenced吧~
或著自己印Log囉~

2018年1月14日 星期日

[Android] android.support.v4.app.fragment vs android.app.fragment 該用哪個?

問題:
我想在App裡用Fragment做切畫面,結果發現有2個包都有Fragment到底該用哪個?

處理:
Google 「android.support.v4.app.fragment  android.app.fragment」


說明:
  1. 照一般說法,如果你的min>=API 11(Android 3.0),應該就是用android.app.fragment。
    現在大部分App min都至少15(Android 4.0.3)起跳了吧,也有看過min設21 (Android 5)的。以2018/01的分布來看,80%涵蓋選21、90%涵蓋選19、95%涵蓋選17,怎樣都超過11呀...
  2. 那實際上呢? 因為Fragment及其相關類別(FragmentManager、FragmentTransaction)還在一直加功能,如果Min不等於Target,有些新功能在android.app.fragment用不了,或是要認裝置版本跑;用v4包的話,寫法就都一樣了。就看有沒有要用到後來的新功能,或是為那新功能自己寫實作在Base之類。

其他要注意的點,就是選好要用哪邊的話就全套都用那邊了...
Fragment、FragmentManager、FragmentTransaction、FragmentPagerAdapter、Activity

這次你選擇哪一邊呢?(咦? 元件東西軍嗎?)

[Android] Error:All flavors must now belong to a named flavor dimension.

問題:
為了用Android Profiler功能,我把Gradle Plugin版本升到3.0.1了(因為AS說GP2.4以上才支援),結果編版時出現錯誤訊息"Error:All flavors must now belong to a named flavor dimension.",該怎麼辦?

處理:
1. 去他提供的網址看。
2. Google 錯誤訊息。

參考:DevAndroid-Migrate to 3.0DevAndroid-Build VariantsStackOverflow

回答:
  1. 簡單說,不想用flavor dimension功能的話,
    就在android {}裡面寫flavorDimensions "default",詳見StackOverflow
  2. 如果真的要一次編出一堆設定組合的APK的時候,建議可用flavor dimension功能,
    假設有A、B、C三個維度,他可編出維度A*維度B*維度C的數量的APK,就不用每個口味寫一堆設定了,詳見DevAndroid

到底為什麼要編那麼多種設定組合呀....QQ

[Android] signature version V1? V2?

問題:
我要匯出簽章APK了,結果Android Studio 3.0.1(其實AS2.2以上就有)叫我一定要至少選一個版本的簽章,我到底該選V1還是V2? 兩個有甚麼差別?

處理:Google 「android signature version」

參考:CSDNStackOverflow

回答:
簡單說,兩個都要勾,

因為V2是Android 7.0才出現的比較安全,而之前的只認得V1。

但如果7.0或以上版本的手機安裝這APK有問題,而且你檢查不出來為何,但V1簽的可過,那就只用V1吧。

詳見參考囉。

2018年1月11日 星期四

[Android] HandlerLeak 處理

問題:
我寫了一個Handler處理訊息,結果Android Studio跳警告說可能引起memory leaks,到底為什麼可能會引起memory leak?除了加上@SuppressLint("HandlerLeak")叫他不要跳警告外,還有甚麼辦法解掉呢?

處理:Google 「HandlerLeak」

參考:清屏網筆記社區簡書

清屏網的文章看來可能引發Leak的情況是:
「當我們通過Handler發送了一個延時消息,這個消息還未來得及處理,當前Activity銷毀了,該消息就會在主執行緒的訊息佇列中等待執行,等待時間到後處理該消息,該消息引用了當前Activity的Handler物件, Handler又引用了當前Activity的物件,這些引用物件會保持到該消息處理完,就導致了當前Activity無法被回收,從而導致了記憶體洩漏。」

那我寫的部分真的會真的會引起memory leak嗎?
可以用筆記社區裡教的方法用AS跟MAT測測看,如果用Android Studio 3.0以上,可用Android Profiler試試,如果該被回收的Activity沒被回收就是囉。

懶得一一測了,那要麼寫才不會引起leak呢?
可參考簡書的這篇文章,跟Android Studio的警告詳細內容寫的解法其實是同一個意思,重點是做個private static class繼承Handler,然後把Activity用WeakReference傳進自製Handler裡處理,目的都是不要直接參考到外部類別(Activity)避免回收不了。

2018年1月10日 星期三

[Android] 2018/1月份 版本分布

參考:Android dashboards


  1. 最重要的,API21+破80%了,如果有新App要做,可以考慮min用21(5.0)了,因為5.0才開始原生支援Material Design呀....還有JobScheduler呀...
  2. OREO(8.X)升為0.7%,出現在榜單4個月,8.1新進榜。
  3. 牛軋糖(7.X)+破27%,出現在榜單已15個月了...
  4. 棉花糖(6.X)以下全部下降。
  5. 牛軋糖(7.X)持續上升。
  6. 還有6.5%的使用中裝置不能玩PMGO跟熊大農場


話說,80%到90%要多久呢? 看之前紀錄...

API 19時:2016/9~2017/7=11個月。
API 18時:2016/7~2017/5=11個月。

我沒有API17+ 剛達到80%的資料了 XD

另外,API 20是Android手錶OS專用,所以沒有在這上面

2018年1月9日 星期二

[Android] 全螢幕載入畫面(splash screen)不要有Actionbar

問題:
我想做一個全螢幕載入畫面(splash screen)不要有Actionbar,但Android Studio預設的畫面都有Actionbar怎辦?

處理:Google 「android no actionbar」

參考:NoActionBar上下變色

解法:

  • 對要當載入畫面(splash screen)的Activity,在Manifest,另外指定它的android:theme,假設叫做FullscreenTheme好了。

  • 在style裡面寫這個FullscreenTheme,它的parent = "Theme.AppCompat.Light.NoActionBar" 或是 "Theme.AppCompat.DayNight.NoActionBar",看你AppTheme用哪種,用相對的NoActionBar。

  • 如果系統狀態列(status bar)想變色,就在FullscreenTheme裡加上colorPrimaryDark,指一個跟載入畫面背景類似但較深的顏色。

  • 如果系統按鈕列(navigation bar)想變色,就在FullscreenTheme 裡加上 android:navigationBarColor,指一個跟載入畫面背景類似但較深的顏色。只是這屬性是API21才出來的,所以min不是21的話,就放在values-v21的資料夾裡的style。

    [2018/2/21更新]  DevAndroid裡有說,"當您自訂瀏覽列和狀態列時,請讓兩者都變成透明,或者只修改狀態列。 在其他所有狀況下,瀏覽列都必須保持黑色。",所以除非上下透明,不然下就不改囉~

大概就這樣,其實上下系統列也可藏,但看了FB、LINE、Youtube等App,都是上下有秀,所以就學他們囉~


2018年1月8日 星期一

[Android] 讓 Snackbar 不要被 BottomNavigationView (BottomBar) 遮住

問題:
根據Material Design的指導,Snackbar要在BottomBar之後但要長出頭,但實際直接叫Snackbar他躲在BottomBar後面說,怎麼辦?

處理:
Google 「BottomNavigationView  Snackbar」
找到幾種作法...

解法:

  1. 繼承改寫CoordinatorLayout.Behavior並在layout指給BottomBar的app:layout_behavior,詳細作法參考某日本Dev的GitHub某馬其頓Dev的Blog。這個做法較能重複利用,用的地方也較簡潔。
  2. 另一個方法是,用SnackBar時,自己抓它的View改它的padding(內部間距)或margin(外部距離),寫個method或是如果有要繼承改寫BottomNavigationView或Snackbar的話,可順便把方法加入。可參考某中國Dev的Blog
  3. 使用第三方BottomBar。
  4. 不要用Snackbar了,用Toast跟Dialog吧。


找資料時,也在StackOverflow看到網友反應的悲劇,4.4以下Snackbar遮BottomBar,5.0以上BottomBar遮Snackbar;

嘛....Google都是先設計UI規範,再實做元件 = =;

所以要Material Design各元件有簡單官方解,看來還有得等,官方解出來前,只能各自發揮創意或是先用有完整解的第三方元件了。

[Android] BottomNavigationView (BottomBar)跟 FloatingActionButton(FAB) 在一起

問題:
我畫面上想要有 下方快捷列(BottomBar)也想要有 懸浮按鈕(FAB),但直接加到Layout好像位置怪怪,有啥辦法可讓FAB正確在BottomBar上方呢?

做法:Google "BottomNavigationView" "FloatingActionButton"

參考:StackOverflow

解法:其實跟StackOverflow裡寫的一樣,只是我寫中文...

  1. 到FAB所在的layout
  2. 在FAB外的CoordinatorLayout 加上BottomBar在FAB下面
  3. 在CoordinatorLayout 跟BottomNavigationView地的屬性裡加上app:layout_insetEdge="bottom"
喔喔,厲害了,FAB長出來了,BottomBar也正常,耶 XD

Android Studio 3.0.1 專案雙開

問題:
我想要寫這個專案時, 參考另一個專案的寫法,Android Studio有辦法可以同時開兩個專案嗎?

參考:好心人教導。

解法:
  1. 先開第一個專案,這相信有用過Android Studio的都會。
  2. 去File > Open
  3. 跳出來一個對話框,選擇New Window
耶~ 成功雙開,可以開始 參考了 XD

2018年1月7日 星期日

Android Studio 新專案加入 Git版控

問題:用Android Studio新建的專案,想加入Git版控,避免改壞要倒回,有什麼好工具?

處理:
嘛....以免費的Git工具來講:

  1. Git 官方工具 是最新最快的,只是Windows版預設要另開視窗打指令。
  2. SourceTree 是免費Git GUI工具中功能最多的,也有定期更新,只是GUI部分,反應有點慢,然後Win版 跟 Mac版 介面略有不同。
  3. TortoiseGit 是有用過TortoiseSVN(小烏龜SVN)的人會覺得熟悉的介面,只是只有Win版。
  4. Android Studio整合Git,要先裝1的Git工具,然後在AS裡設定位置,即可整合使用,可在AS下方的console打git指令或是一些AS提供的簡單GUI可操作,也有來自IntelliJ的差異合併工具的樣子。中文教學點這 繁中AS3.0Git教學簡中AS2.3Git教學,官方好像沒教學文。
上面四種來說1跟4都是比較官方的做法,

只是1、2差異工具(DiffTool)跟合併工具(MergeTool)要自己指定囉~
兩平台都有人大推的是Beyond Compare 只是這是要錢工具(不想後悔併錯可考慮BUY下去 XD)

不想花錢的話,
Win可灌TortoiseSVN或TortoiseGit,然後用他的TortoiseMerge(沒單獨出真可惜...),只是記得第一次使用前先設為UTF-8編碼(不然會是Win的編碼方式);

Mac的話似乎內建差異跟合併工具FileMerge,但有時呆呆,會併錯,可參考這個Beyond Compare在Mac的替代方案 ,或是看SourceTree官方推薦的工具

至於Git的相關概念跟流程操作,那是一個要自己做過幾次才能理解的東東...

Android App 桌面圖示(Launcher icon) 各size製作

問題:
一個App的桌面icon,要做好多尺寸,除了Visual Designer(VD)作好最大尺寸,一個一個縮之外,還有甚麼好辦法呢?

處理:
在Google搜尋了「Android icon」第一頁結果發現以下能用的方法:

  1. Android Asset Studio>Launcher icon generator
    這是線上版icon產生器,可以打字、傳圖、選icon來決定前景,背景可選色、形狀、縮邊,還能對前景作陰影特效;會產生512px 商店用的、192px xxxhdpi用的~48px mdpi用的,res部分資料夾結構會自動生成。
  2. Image Asset Studio
    官網介紹這是Android Studio內建功能,看來除了跟第一個一樣的功能,還能生出Android 8.0 Oreo開始才有的adaptive launcher icon(前後景分開,後面可變形)。
    詳細操作,網頁裡有寫 (如果是英文苦手,可在該網頁下方切簡體中文看),下面只寫簡單操作步驟:
    1-檢視方式選Android檢視。
    2-在res點右鍵,選New > Image Asset。
    3-剩下就看Image Asset Studio介面操作唄。


嗯嗯....所以說,

  • 如果要設計前後景分開的Material Design風格的icon,記得跟VD說可以只給前景的圖跟背景色碼即可,剩下的Image Asset Studio 可完成。當然,如果VD們會操作更好,因為還有縮邊、位置等問題,不是每個Dev都那麼眼利。
  • 如果還是設計傳統的含背景icon,那就請VD做最大尺寸(512*512)吧,再來縮,如果VD會縮那當然更好囉~ 如果iOS也要用一樣的,那最大尺寸要給1024*1024喔。


耶~ 又解決一個問題!

2018年1月6日 星期六

Android Studio 3.0.1 改package name

問題:Android Studio 3.0.1生出來的package名稱架構不合預期,要改package name,但用到地方很多,除了手動搬,有啥好招?

參考:http://happycodingandlearning.blogspot.tw/2017/07/android-android-studio-packagename.html

作法:
  1. 改gradle的applicationId
  2. 改manifest的package
  3. 對每一層package資料夾分別refactor>rename(這裡太多層感覺會QQ) 
  4. 原本的較多層,就把原目標層的檔在AS中,全拉到新目標層,AS會跳選項幫你處理關聯參考;原本的資料夾若空了,可按右鍵>Delete。
  5. 原本的較少層,就在Project檢視>點右邊小齒輪>點掉Compact Empty Middle Package的勾,才能顯示空的package資料夾;然後在目前最後層,點右鍵>New>Package;加好資料夾,就把原目標層的檔在AS中,全拉到新目標層,AS會跳選項幫你處理關聯參考。
嘛....大概這樣,做個筆記,我不太花時間寫圖文並茂的blog

但還是希望能幫到遇到同問題的人囉。