目次
- はじめに
- スクロールを手繰り寄せて
- ソフトウェアキーボードを貫いて
- さいごに
はじめに
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 が必要なのも未調査。
さいごに
詳しくは未調査、な部分が多いですがまた時間があれば、ということで。