potatotips #45 (iOS/Android開発Tips共有会) – connpass に Android ブログ枠として参加しました。
今回の Android の発表は以下の通りでした。
- iOSエンジニアが悩んだUpボタンについて by @EndoMari
- AutoResizing TextView by @kettsun0123
- InViewとOutView 〜Viewの表示を検知する〜 by @e10dokup
- Activityの背景をぼかす by @niba1122
- Android におけるライフサイクル by @nobuoka
- Swaggerで定義したAPI仕様からRetrofitで使用するinterfaceを自動生成してみる by @horie1024
- WebView😇😇😇 by @KeithYokoma
- Tasting Flutter Samples by @konifar
- 今さら始めるInstantApp by @satsukies
- .classファイルからKotlinだった時の姿を知りたいマン by @kgmyshin
iOSエンジニアが悩んだUpボタンについて
Android エンジニアでもたまに悩む? Up ボタンについての発表でした。
Navigation with Back and Up でも Play ストアを例にしていて、Book details の Up ボタンは Book list に移動するが、Book details から Movie details に移動すると Up ボタンは Movie list に移動するようになります。
前の画面に戻る Back ボタン はわかりやすいのですが、上の階層に移動する Up ボタン はアプリの階層を理解していないとどこに移動するかわからないので、なかなか難しいところです。
Tips として、Up ボタンの移動先を動的に変更する方法を紹介していました。
AutoSizingTextView
Autosizing TextViews は Android 8.0 からの機能ですが、Support Library でも提供されているので、ほとんどの端末に導入することが可能です。
この View を使う注意点として、下記の内容を発表されていました。
- wrap_content を指定しない
- android:singleLine を使わない
singeliLine は API level 3 から非推奨なので maxLines を使えば問題ないのですが、wrap_content はうっかり使ってしまうことがありそうなので注意したいところです。
InViewとOutView 〜Viewの表示を検知する〜
この発表では View の可視領域の割合が閾値を超えたら検知するというお話でした。ViewTreeObserver が大活躍する分野です。
ViewTreeObserver で監視して、View#getDrawingRect(Rect) と View#getGlobalVisibleRect(Rect) を駆使して可視領域の面積を求める方法が紹介されていました。
Activity の背景をぼかす
上の Activity の背景がぼやけて下の Activity がうっすら見える方法が紹介されていました。
API level 14 までなら FLAG_BLUR_BEHIND で実装できたと思うのですが、この発表では下記の手順で実装されていました。
- 下の Activity の背景をキャプチャする
- Blur 処理をかける
- 上の Activity の背景に指定する
重い Blur 処理は、久しぶりに見た AsyncTaskLoader で対応されていました。
Android におけるライフサイクル
ライフサイクルのイベント検知が楽に実装できるようなる Handling Lifecycles with Lifecycle-Aware Components と ViewModel の使いどころを発表されていました。
Application#registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks) と勘違いしていたのは秘密です。
ViewModel は Configuration Changes を超えて生存できるが、それ以外の再生成には対応しないので使いどころを考える必要があるとのことでした。
Dagger の Releasable References は強参照と弱参照を切り替えられる機能で、便利そうです。
Swaggerで定義したAPI仕様から Retrofitで使用するinterfaceを自動生成してみる
Swagger で API の仕様が定義されており、それを利用して Retrofit の Interface を生成するお話でした。iOS でも発表があり、共通の API から自動生成するのは理に適っていると思いました。
下記が手順です。
- swagger-parser で必要な情報取得
- square/kotlinpoet で Interface を生成
- それを Gradle Plugin 化してコマンドで一発変換
Gradle Plugin 化は How to Create Gradle Plugin in Kotlin を参考にしたそうです。
WebView😇😇😇
カメラの罠とどっちが多いのかわかりませんが、できれば触りたくない WebView についての発表でした。
WebView に WebViewClient を指定せずにローカルなファイルのリンクを踏むと、FileUriExposedException という例外が発生する罠でした。
Testing Flutter Samples
Building Beautiful UIs with Flutter の次のステップとして、サンプルが紹介されていました。クロスプラットフォームを避けてきたのですが、デモを見せられて挑戦してみたくなりました。
- Basic
- hello_world
- Component Sample
- catalog
- layers
- Native Integration
- flutter_view
- platform_channel
- platform_channel_swift
- platform_view
- Advanced
- flutter_gallery
- stocks
いまさら始める Instant App
私も Prott Blog – Prott Viewer for AndroidがInstant Appsに対応しました📲🎉 で日本では比較的早く対応した(と思う) Instant Apps の話でした。短い時間ながらも一から手順を紹介されていました。
既存のアプリを対応させるのは設計次第で難易度が分かれると思いますが、対応できるならしておきたい機能です。
.class ファイルから Kotlin だった時の姿を知りたいマン
ネストした data class のデータを自動生成するために .class ファイルを調べたお話でした。
.class ファイルに @lkotlin/Metadata があって、d1 や d2 がどうのこうのと話が進んでいましたが、すでに調べるメソッドが用意されていたという落ちでした。KClass.isData です。