困ったこと

図のように画面が回転したときも検索結果が表示され続けるようにしたかったとします。
画面回転時はActivity/Fragmentが再生されるので、Fragment#onRestore時にEditText#dispatchKeyEventを用いて検索イベントを発行すれば検索結果も復元できると考えました。
しかし結果は何も起こりませんでした。
何が起こっていたか。
EditText#dispatchKeyEventの結果はfalseでした。
検証してみると、Fragment#onRestoreが実行されたあとにいくらか経ってから以下のSearchViewModel#setOnKeyListener()が実行されていました。
ViewModel
public class SearchViewModel {
...
public View.OnKeyListener setOnKeyListener() {
return new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
...
return true;
}
};
}
...
}
レイアウト
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable name="viewModel"
type="xxx.SearchViewModel" />
</data>
<RelativeLayout
android:id="@+id/search_fragment_container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/search_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Keyword"
android:inputType="text"
android:onKey="@{viewModel.setOnKeyListener}">
</EditText>
</layout>
解決方法
OnWindowFocusChangeListener#onWindowFocusChangedをつかいました。
例えばこうするとViewが生成されてDataBindingの解決もされたあとにやりたいことが実行されるように仕込むことができます。
View view = binding.getRoot().findViewById(R.id.search_fragment_container);
view.getViewTreeObserver().addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() {
@Override
public void onWindowFocusChanged(boolean hasFocus) {
...
//やりたいこと
editText.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER));
}
});