Android ViewからActivityを取得する
はじめに
今回はViewからActivityを取得する方法を紹介します。
ViewからActivityを取得する必要があるケースというのはあまり出会うことはないかもしれませんが、、
ついこの間、必要になったことがあったのでこちらに残しておこうかと思います。
方法
Viewの拡張プロパティに activity というインスタンスを追加するのが早いです。
/** * Activity */ val View.activity: Activity? get() { var context = context while (context is ContextWrapper) { if (context is Activity) { return context } context = context.baseContext } return null }
参照
GoogleのサポートライブラリでViewからActivityを取得する実装がされていました。
Dagger2 vs Koin
概要
- DIライブラリについて比較する
DIライブラリ
https://www.slideshare.net/Jintin1018/dagger-2-vs-koin https://blog.moyuru.io/post/tech/2018/10/daggertokoin/
Dagger2
利点
- Runtimeエラーが発生しない
- 処理速度が早い
欠点
- 学習コスト高い
- コンパイルが長くなる
Koin
利点
- 学習コスト低い
- 実装コスト低い
- ViewModelが標準対応
- ピュアKotlin
欠点
- Runtimeエラーが発生する
補足
motif
- Uberが開発しているDagger2をシンプルにしたDIライブラリ
ViewBinding vs DataBinding vs Android Kotlin Extensions
概要
UIインスタンスの生成において、以下の3つを比較する。
- ViewBinding
- DataBinding
- Android Kotlin Extensions
ViewBinding
https://developer.android.com/topic/libraries/view-binding
- Android JetPack
- Android Studio 3.6 Canary 11+ から使用できる
- findViewByIdが省略できる
DataBinding
https://developer.android.com/topic/libraries/data-binding?hl=ja
- Android JetPack
- findViewByIdが省略できる
- ViewModelとxmlを直接バインドできる
- BindingAdapterでカスタムアトリビュートが作成できる
- Groupieが対応している
Android Kotlin Extensions
- JetBrain製
- findViewByIdが省略できる
- ViewBinding/DataBindingのように専用インスタンスの生成は不要
- Groupieが対応している
Android SingleActivity vs MultiActivity
SingleActivityの利点
- バックキー制御がシンプルになる
- Fragmentからのバックキー制御もコールバックが用意されたので簡単になった
- Android Architecture Component Navigationが使える
- deepLinkに対応している
- Fragment・Dialogの画面遷移がシンプルになる
- NavigationDrawer・AppBarLayout・BottomAppBar・BottomNavigationViewの管理が統一される
- ファイル数が少なくなるのでコードも削減される
- 画面実装時にActivity・Fragmentどちらで実装するか困惑しなくなる
- Jake神が推奨
- DroidKaigi/conference-app-2019も採用
MultiActivityの利点
- バックキー制御がほぼいらない
- NavigationDrawer・AppBarLayout・BottomAppBar・BottomNavigationViewを画面ごとに設定できる
Android デザイナーに用意してもらうアプリアイコン一覧
はじめに
Androidのアイコンは結局どんなサイズを用意すればいいのかという質問をよくデザイナーの方にされるのでこちらに記録しておきます。
結論
以下の2つのアイコンを用意してもらえれば、ImageAssetでインポートできます。
ホームアイコン
項目 | 内容 |
---|---|
形式 | png |
サイズ | 1024x1024px |
ロゴカラー | なんでも可 |
背景カラー | 透明(背景色はImageAssetで指定する) |
アプリ通知アイコン
こちらはアプリ内に通知を実装している場合に必要になります。
項目 | 内容 |
---|---|
形式 | png |
サイズ | 128x128px |
ロゴカラー | 白 |
背景カラー | 透明(背景色の指定は基本的にできない) |
[アプリ通知アイコンの記事リンク]
Android アプリ通知のアイコンは"白と透過"で用意する
はじめに
今回はアプリの通知(Push通知)のスモールアイコンについて解説したいと思います。
このスモールアイコンですが、実は奥が深くバージョン差異が多いので、注意が必要です。
通知に関する概要のリンクを貼っておきます。 developer.android.com
スモールアイコンとは
スモールアイコンとは、以下の画像の①のことです。
通知に関する概要でも説明されていますが、 setSmallIcon()
で設定する画像ですね。
また、ステータスバーにも表示されているのも同じくスモールアイコンです。(色が変わってますね)
val builder = NotificationCompat.Builder(this, id).apply { setContentTitle(getString(R.string.notification_title)) setContentText(data.message) setSmallIcon(R.mipmap.ic_notification_small) ←コレ // 省略 }
この通知自体の表示もバージョンによって異なるので、通知バー自体のUIの違いについてはこちらを参考にどうぞ。
バージョンまたは条件ごとに表示が異なる
通知の色をコードで指定しなかった場合
バージョン | 表示 |
---|---|
7.0 | 端末に依存する。通知アイコンはグレー表示されたり、元のアイコンカラーになる。 |
8.0 | 通知アイコンは元のアイコン画像の色(オレンジ), 通知テキストはAndroid側により指定(グレー) |
9.0~ | 通知アイコン、通知テキストの色はAndroid側により指定されてしまう |
通知の色をコードで指定した場合
バージョン | 表示 |
---|---|
7.0~8.0 | 通知アイコン・テキストは指定した色になる。コントラスト的にふさわしくない場合は色が変更される。 |
9.0~ | 通知アイコンのみ指定した色になる。コントラスト的にふさわしくない場合は色が変更される。 |
スモールアイコンは"白と透過"で用意
バージョン差異だったり、端末依存だったり、とてもめんどくさいですよね。
なので、通知アイコンの画像は色は「白」と「透過」だけで用意するのが鉄則です。(というかそれが推奨されています)
こんな画像が理想
カラー:黒の部分が透過・白の部分が白のPNG画像
サイズ:128x128px
ImageAssetで作成
以下のすべてのサイズが必要になるのですが、ImageAsset機能を使えばすべてのサイズにわけてインポートしてくれます。
一番大きなサイズである128x128pxを用意しておきましょう。
mdpi 32x32
hdpi 48x48
xhdpi 64x64
xxhdpi 96x96
xxxhdpi 128x128
ImageAssetを起動
タブをNotification Iconsに切り替える
独自の画像を設定する場合はAssetTypeをImageにして設定する
Firebase Cloud Firestore の関連データは Reference を使う
はじめに
Firebase Cloud Firestore の関連データを扱う場合は Reference型 を使いましょう。
Reference型とは FirestoreのCollectionReference・DocumentReferenceのことで、以下のドキュメントの「Cloud Firestore の参照」のことです。
関連データを保存する
Reference型はリレーションシップ(関連)データを保存する際に使用すると便利です。
関連付けることで、1: N , 1:1 に対するデータを保存することができます。
どんな時に使えるのか
例えば、チャットを実装する場合に「トーク一覧画面」「トーク画面」という2つを作るとします。(LINEやFacebookMessagerを想像してもらえるといいと思います)
その場合、「トークルームのテーブル」と「メッセージのテーブル」がデータとして必要になります。
かつ、「トークルームのテーブル」には最新メッセージを関連づけて保存しておくことができます。
オブジェクトへの変換も簡単
Firestore#toObject関数を使えば関連データ含めて、オブジェクトに変換することが可能です。
/** * メッセージルーム * * @property id ID * @property latestMessage 最新メッセージ */ data class TalkRoom( val latestMessage: Message? // ...省略 )
オブジェクトへの変換方法はこちらでも紹介しています。
ストレージには使えない
Firebase Storageのデータ参照を直接持つことは現状は無理なようです。
画像をStorageに保存して、FirestoreにパスをStringで保存しておくのがいいかもしれません。
Android SharedPreference のデータを実機で変更する方法
はじめに
以前、SharedPreferenceのデータを確認する方法を紹介しました。
今回はそれを実機で確認することもできるので紹介します。
Android-Hyperionを導入
Android-Hyperionというライブラリを使うと実機で確認できる上、データを動的に変更することも可能です。
SharedPreferenceだけでなく、様々なデバックツールが含まれていますので、必要なものを各自導入を検討してください。
SharedPreferenceについては、こちらを導入すればOKです。
debugImplementation 'com.willowtreeapps.hyperion:hyperion-shared-preferences:{latest_version}'
補足
Android-HyperionはSharedPreferenceだけでなく、様々なデバックツールが含まれています。
詳しくはこちらの記事を参考にしてみてください。
Android Jetpack Room データをGUIで確認する方法
はじめに
今回は、Android Jetpackライブラリの一つであるRoomをGUIで確認する方法を紹介します。
Roomとは、AndroidのSQLiteをより使いやすくしてくれているORMラッパーライブラリの一種です。
SQLiteのファイルを抽出する
Roomを使用して保存した場合、SQLiteファイルとして保存されています。
このファイルのパスは以下の場所にあります。
$ /Users/{Mac名}/Documents/AndroidStudio/DeviceExplorer/data/data/{アプリケーションID}/databases/{roomファイル名}
DeviceExplorerはSharedPreferenceは確認する時に紹介しました。
開き方はこちらで説明しています!
GUIツールで確認
次に、SQLiteに対応しているGUIツールをインストールしていきます。
これは有料版と無料版があるので、無料で確認できるほうを紹介します。
多少手間はかかりますが、無料版でも問題なく確認することは可能です。
DB Browser for SQLite(無料)
SQLiteが対応しているものであればなんでもいいですが、今回はこちらのアプリをインストールします。
Windows版・Mac版をインストールしてください。
Homebrewでもインストール可能です。
補足
Android SharedPreferenceのデータ確認方法はコチラで紹介しています。