【Android】ExtensionとLiveDataを使ってSnackbarを表示する

こんにちは。
最近気になっているパンは一本堂の食パン、mukaiyachiです。

SnackbarはToastのようにメッセージを表示する機能です。
画面下からせり出し、一定時間経過すると非表示になります。

使用にはSupport Design Libraryの追加が必要です。

基本的な使い方は以下の様に、第1引数にSnackbarを表示する際に親となるView、第2引数に表示する内容、第3引数に表示する長さを渡して、show()メソッドで画面に表示します。

 

この基本的な使い方をいつも行うでも良いですが、毎回Viewや表示する長さを渡したり、show()メソッドをコールしたりする必要があります。
特に第1引数のViewを用意するのが地味に面倒くさそうです。

 

これをExtension(拡張関数)とLiveDataを使うようにします。
LiveDataをsubscribeすればViewや長さを渡したり、show()メソッドをコールする処理を毎回しなくても、表示したい内容だけを渡せば随時Snackbarが表示できるようになります。

※Activityクラスとレイアウト、Fragmentクラスとレイアウト、ViewModelクラスがあることが前提です。無い場合は別途用意が必要です。

Fragmentは以下のようにするとViewModelと一緒に作成されるのでおすすめです。
・Android Studioの左メニューで、パッケージ名右クリック。
・選択メニュー内のNew -> Fragment -> Fragment(with ViewModel) を選択。

 

まずはDataBindingを使うようにします。
レイアウトXMLを<layout>タグで囲むようにし、バインディング変数(<data>タグ内に設定)にViewModelを定義します。

次にViewクラスのExtensionを作成してsetupSnackbar()メソッドとshowSnackbar()メソッドを追加します。
setupSnackbar()メソッドの第2引数が表示する内容を含むLiveDataです。
この値が変更された事をトリガーとしてshowSnackbar()メソッドが呼び出され、Snackbarが表示されます。

あとsetupSnackbar()メソッドで使用していますが、以下のようなEventクラスが無い場合は追加します。

これはsubscribeしているLiveDataが複数呼び出されないように制御するためのものです。

次にViewModelに表示したい内容を入れるLiveDataと、他のクラスやメソッドから入れるために使うメソッドを用意します。

次にレイアウトにBindingしたViewModelに紐付けるかたちで、追加したsetupSnackbar()メソッドを呼ぶようにします。
第2引数にはViewModelで用意したLiveDataを入れます。

最後に任意のタイミングでViewModelクラスに用意したshowSnackBar()メソッドにLiveDataに表示したい内容を渡してあげればSnackbarが表示されるようになります。