閉じる

データバインディングと layout選択

データバインディングをバシバシ使うようになって色々と試しているのだけど、困ったことが。

values/にこんなのを用意。

4962-0.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="preference_display" type="layout">@layout/preference_display_narrow</item>
</resources>
values-w400dp/にはこんなのを用意する。
4962-1.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="preference_display" type="layout">@layout/preference_display_wide</item>
</resources>
アプリからは R.layout.preference_displayを参照するだけでスクリーンの幅によって適切なレイアウトが選択されるというわけだけど、データバインディングとは相性が悪い。
Androidのデータバインディングは基本的にコンパイルタイムの処理なので preference_display_narrow/preference_display_wideに付いてのバインディング処理クラスは生成されても preference_displayについては生成しようがない。
というわけで、こんな処理を書いた。
4962-2.java
TypedValue typedValue = new TypedValue();
getApplicationContext().getResources().getValue(R.layout.preference_display, typedValue, true);
switch (typedValue.resourceId) {
default:
case R.layout.preference_display_narrow:
PreferenceDisplayNarrowBinding NarrowBinding = PreferenceDisplayNarrowBinding.inflate(inflater);
NarrowBinding.setItem(mDisplayData);
return NarrowBinding.getRoot();
case R.layout.preference_display_wide:
PreferenceDisplayWideBinding WideBinding = PreferenceDisplayWideBinding.inflate(inflater);
WideBinding.setItem(mDisplayData);
return WideBinding.getRoot();
}
んーむ、泥臭いな。
もうちっとマシな方法はないもんだろうか?

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)