chigichan24のお気持ち表明

イケてるエンジニアになりたい.

AndroidのToolbarをいい感じに触る

ググったときに???みたいな記事が多い気がしたのと,タイピング練習のつもりで記事を書きます.講義が習ったことをちんたら喋ってて暇だった

あるアプリケーションをリファクタしていたら,ToolbarにActivityで直接setTitleするコードがありました.動的になんか差し替えるならまだしも,基本的に静的なテキストはxmlで記述する方針で書いていたのでリファクタします.ついでに,onClickまわりもいい感じにします.

f:id:chigichan24:20180126130510p:plain

こういうやつです.

コード上から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の中身を書けばスッキリします.

これで,コードがスッキリした感じになりながら目的を達成できました.おわり.