1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

requestFocus は狙いを定めて

Posted at

目次

  1. はじめに
  2. スクロールを手繰り寄せて
  3. ソフトウェアキーボードを貫いて
  4. さいごに

はじめに

 AndroidのViewのフォーカスを切り替えるには view.requestFocus(), view.requestFocusFromTouch() を使います。しかし、どうもフォーカス対象のViewが画面外にある場合は失敗するようなので(※詳しくは未調査)、その対処方法を記載します。

スクロールを手繰り寄せて

 これは、フォーカス対象のViewが、ScrollView上でスクロールされて見えなくなっているときの対処方法です。

Activity.onClick(View)とか
// スクロールは post しないといけないもよう
scrollView.post(() -> {
    // フォーカス対象のViewまでスクロールする
    scrollView.scrollTo(0, focusingView.getBottom());
    // フォーカスする
    focusingView.requestFocusFromTouch();
});

ソフトウェアキーボードを貫いて

 これは、ソフトウェアキーボードが出現したことにより、フォーカス対象のViewが見えなくなっているときの対処方法です。もしかしたらキーボードの下に隠れただけなら必要ないかもしれませんが(※詳しくは未調査)。

Activity.onClick(View)とか
// InputMethodManager.hideSoftInputFromWindow() を利用し、ソフトウェアキーボードを隠す
// 引数の WindowToken は 現在フォーカス中のViewから取得する
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

// キーボードを隠しただけでは、キーボードの裏側が白いままなので、再描画する
getWindow().getDecorView().requestLayout();

// フォーカス対象のViewにフォーカスする。時間差が必要なようなので、postする
focusingView.post(() -> focusingView.requestFocusFromTouch());

 再描画は invalidate() でも大丈夫らしいです(未調査)。違いも未調査。あと、フォーカスするときに post が必要なのも未調査。

さいごに

 詳しくは未調査、な部分が多いですがまた時間があれば、ということで。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?