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を取得する実装がされていました。

android.googlesource.com

git pullのとき常にpruneするための設定

概要

今回は、git pull する際に常に--pruneを有効にする方法を紹介します。
これはリモートブランチからすでに消されているブランチをローカルに残さないようにするためのオブションです。

方法

すべてのリポジトリに対して有効にする場合

$ git config --global fetch.prune true

特定のリポジトリに対して有効にする場合

$ git config --local fetch.prune true

.gitconfig に下記の設定が書き込まます

[fetch]
       prune = true

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ライブラリ

github.com

ViewBinding vs DataBinding vs Android Kotlin Extensions

概要

UIインスタンスの生成において、以下の3つを比較する。

  • ViewBinding
  • DataBinding
  • Android Kotlin Extensions

ViewBinding

https://developer.android.com/topic/libraries/view-binding

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でインポートできます。

developer.android.com

ホームアイコン

項目 内容
形式 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) ←コレ
    // 省略
}

f:id:QoopMk:20191014175329p:plain

f:id:QoopMk:20191014175222p:plain

この通知自体の表示もバージョンによって異なるので、通知バー自体のUIの違いについてはこちらを参考にどうぞ。

phicdy.hatenablog.com

バージョンまたは条件ごとに表示が異なる

通知の色をコードで指定しなかった場合

バージョン 表示
7.0 端末に依存する。通知アイコンはグレー表示されたり、元のアイコンカラーになる。
8.0 通知アイコンは元のアイコン画像の色(オレンジ), 通知テキストはAndroid側により指定(グレー)
9.0~ 通知アイコン、通知テキストの色はAndroid側により指定されてしまう

通知の色をコードで指定した場合

バージョン 表示
7.0~8.0 通知アイコン・テキストは指定した色になる。コントラスト的にふさわしくない場合は色が変更される。
9.0~ 通知アイコンのみ指定した色になる。コントラスト的にふさわしくない場合は色が変更される。

スモールアイコンは"白と透過"で用意

バージョン差異だったり、端末依存だったり、とてもめんどくさいですよね。
なので、通知アイコンの画像は色は「白」と「透過」だけで用意するのが鉄則です。(というかそれが推奨されています)

こんな画像が理想

カラー:黒の部分が透過・白の部分が白のPNG画像
サイズ:128x128px

f:id:QoopMk:20191014183629p:plain

ImageAssetで作成

以下のすべてのサイズが必要になるのですが、ImageAsset機能を使えばすべてのサイズにわけてインポートしてくれます。
一番大きなサイズである128x128pxを用意しておきましょう。

mdpi 32x32
hdpi 48x48
xhdpi 64x64
xxhdpi 96x96
xxxhdpi 128x128

ImageAssetを起動

f:id:QoopMk:20191014183016p:plain

タブをNotification Iconsに切り替える

f:id:QoopMk:20191014183010p:plain

独自の画像を設定する場合はAssetTypeをImageにして設定する

f:id:QoopMk:20191014183006p:plain

Firebase Cloud Firestore の関連データは Reference を使う

はじめに

Firebase Cloud Firestore の関連データを扱う場合は Reference型 を使いましょう。
Reference型とは FirestoreのCollectionReference・DocumentReferenceのことで、以下のドキュメントの「Cloud Firestore の参照」のことです。

firebase.google.com

関連データを保存する

Reference型はリレーションシップ(関連)データを保存する際に使用すると便利です。
関連付けることで、1: N , 1:1 に対するデータを保存することができます。

どんな時に使えるのか

例えば、チャットを実装する場合に「トーク一覧画面」「トーク画面」という2つを作るとします。(LINEやFacebookMessagerを想像してもらえるといいと思います)
その場合、「トークルームのテーブル」と「メッセージのテーブル」がデータとして必要になります。
かつ、「トークルームのテーブル」には最新メッセージを関連づけて保存しておくことができます。

f:id:QoopMk:20191013191340p:plain

オブジェクトへの変換も簡単

Firestore#toObject関数を使えば関連データ含めて、オブジェクトに変換することが可能です。

/**
 * メッセージルーム
 *
 * @property id ID
 * @property latestMessage 最新メッセージ
 */
data class TalkRoom(
    val latestMessage: Message?
    // ...省略
)

オブジェクトへの変換方法はこちらでも紹介しています。

qoopmk.hatenablog.jp

ストレージには使えない

Firebase Storageのデータ参照を直接持つことは現状は無理なようです。
画像をStorageに保存して、FirestoreにパスをStringで保存しておくのがいいかもしれません。

f:id:QoopMk:20191009212631p:plain

Android SharedPreference のデータを実機で変更する方法

はじめに

以前、SharedPreferenceのデータを確認する方法を紹介しました。
今回はそれを実機で確認することもできるので紹介します。

qoopmk.hatenablog.jp

Android-Hyperionを導入

Android-Hyperionというライブラリを使うと実機で確認できる上、データを動的に変更することも可能です。
SharedPreferenceだけでなく、様々なデバックツールが含まれていますので、必要なものを各自導入を検討してください。

github.com

SharedPreferenceについては、こちらを導入すればOKです。

debugImplementation 'com.willowtreeapps.hyperion:hyperion-shared-preferences:{latest_version}'

補足

Android-HyperionはSharedPreferenceだけでなく、様々なデバックツールが含まれています。
詳しくはこちらの記事を参考にしてみてください。

qiita.com

Android Jetpack Room データをGUIで確認する方法

はじめに

今回は、Android Jetpackライブラリの一つであるRoomをGUIで確認する方法を紹介します。
Roomとは、AndroidSQLiteをより使いやすくしてくれているORMラッパーライブラリの一種です。

developer.android.com

SQLiteのファイルを抽出する

Roomを使用して保存した場合、SQLiteファイルとして保存されています。
このファイルのパスは以下の場所にあります。

$ /Users/{Mac名}/Documents/AndroidStudio/DeviceExplorer/data/data/{アプリケーションID}/databases/{roomファイル名}

DeviceExplorerはSharedPreferenceは確認する時に紹介しました。
開き方はこちらで説明しています!

qoopmk.hatenablog.jp

GUIツールで確認

次に、SQLiteに対応しているGUIツールをインストールしていきます。
これは有料版と無料版があるので、無料で確認できるほうを紹介します。
多少手間はかかりますが、無料版でも問題なく確認することは可能です。

DB Browser for SQLite(無料)

SQLiteが対応しているものであればなんでもいいですが、今回はこちらのアプリをインストールします。
Windows版・Mac版をインストールしてください。
Homebrewでもインストール可能です。

sqlitebrowser.org

f:id:QoopMk:20191013101608p:plain

補足

Android SharedPreferenceのデータ確認方法はコチラで紹介しています。

qoopmk.hatenablog.jp