ググったときに???みたいな記事が多い気がしたのと,タイピング練習のつもりで記事を書きます.講義が習ったことをちんたら喋ってて暇だった
あるアプリケーションをリファクタしていたら,ToolbarにActivityで直接setTitle
するコードがありました.動的になんか差し替えるならまだしも,基本的に静的なテキストはxmlで記述する方針で書いていたのでリファクタします.ついでに,onClick
まわりもいい感じにします.
こういうやつです.
コード上からsetTitleを消しさる
google先生で適当にぐぐるとtheme
をいじって...とか書いてありますが,そんなことしなくていいです.
確かにxmlファイル上で参照android:textでは設定できないけど...
xmlns:app="http://schemas.android.com/apk/res-auto"
を記述してapp:
で参照すれば良いです.つまり,
コード上で下のように書いていたものを
toolbar.setTitle("HogeFuga");
xmlで下のように書けば良い
<android.support.v7.widget.Toolbar app:title="HogeFuga"
これでsetTitle
をなくすことができました.これと同じ要領でアイコンも指定できます.
コード上からsetNavigationOnClickListenerを消し去る
ただのonClick
であれば,android:onClick
でdatabindingするといい感じにうぇい(語彙力)して終わりですが,Navigationのクリックを取るのはちょっと工夫が入ります.
同じ要領でapp:navigationOnClickListener
みたいなのはなく,android:onClick
取ってきたらToolbar全体にクリックリイベントを挿す羽目になるので,どうにかします.
BindingAdapter
BindingAdapterでクリックイベントをbindingします.これがjavaであれば,
@BindingAdapter("navigationOnClick") public static void setNavigationOnClick(Toolbar toolbar, View.OnClickListener clickListener){ toolbar.setNavigationOnClickListener(clickListener); }
とすれば良いです.これをkotlinに素直にすると,
object CustomBinder { @JvmStatic @BindingAdapter("navigationOnClick") fun onNavigationClick(toolbar: Toolbar, clickListener: View.OnClickListener) = toolbar.setNavigationOnClickListener(clickListener) }
となりますが,これは非常にダサい上に@JvmStatic
警察に捕まります(?)
なので,Toolbarの拡張関数として書いて,いい感じにすると,
@BindingAdapter("navigationOnClick") fun Toolbar.onNavigationClick(clickListener: View.OnClickListener) = setNavigationOnClickListener(clickListener)
となっていい感じにかわいい感じ(?)になって,xmlでは
app:navigationOnClick="@{viewModel::onBackButtonClicked}"
こんな感じに指定して,コードでonBackButtonClicked
の中身を書けばスッキリします.
これで,コードがスッキリした感じになりながら目的を達成できました.おわり.