LoginSignup
1
0

More than 5 years have passed since last update.

【Android】画面回転時に表示内容を修復する。【onWindowFocusChanged】

Posted at

困ったこと

スクリーンショット 2018-04-18 19.03.36.png

図のように画面が回転したときも検索結果が表示され続けるようにしたかったとします。
画面回転時は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));
    }
});

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0