本記事について
- 「EditTextを配置した画面において、フォームは出したくないけど、画面表示時にキーボードが表示され入力可能な画面を作る」という要件で実装する機会があったのですが、
キーボードを表示するためにEditTextにfocusを当てようとしてハマったことがあったので、メモ書き程度ですがまとめてみました。
("invisible風" についてはフォームは見えないけどフォーカスも当てられて、任意の文字列を入力できるという点から勝手にそう呼んでいます)
対応内容
- 以下のような属性を指定したEditTextを用意します。(次項に記載のポイントが満たせていれば属性の設定値はアレンジ可能)
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="1dp"
android:inputType="numberPassword"
android:maxLength="4"
android:focusable="true"
android:clickable="false"
android:focusableInTouchMode="true"
android:background="@null"
android:textColor="@null"
android:textColorHint="@null"
android:cursorVisible="false"
android:visibility="visible"
android:autofillHints=""
android:hint="" />
- あとは任意のタイミングで、上記のEditTextに対して
requestFocus()
をコールすればOKです。- 今回は画面表示時にフォーカスが当たった状態にしたかったので、
onViewCreated()
内でコールしました
- 今回は画面表示時にフォーカスが当たった状態にしたかったので、
ポイント
- 以下を満たすことで、テキストエリアの(なんちゃって)非表示化 + 入力が可能となります。
-
layout_height
およびlayout_width
の値を0dp
以上とすること- 値が 0 になってしまうと
requestFocus()
のコール(直接Viewをタップした場合も同様)、フォーカスを当てられない状態になってしまいます
- 値が 0 になってしまうと
- 標準で表示される部品を非表示とする
- 入力欄の背景(=background)
- カーソル(=cursorVisible)
- ヒントテキスト(=autofillHints, hint, textColorHint)
- 入力テキスト(=textColor)
-
追記
フォーカスが外れた状態からキーボードを明示的に表示する際、InputMethodManagerを利用しないとキーボードを表示することができませんでした。
正攻法なのかはわかりませんが、少なくとも要件を満たすにこの実装必要でした。
fun showKeyBoard(context: Context) {
edit_text.requestFocus()
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(edit_text, InputMethodManager.SHOW_IMPLICIT)
}
最後に
同様のことをするケースがあまりないからか調べてもなかなかヒットせず、ゴリ押し感が否めない対応となってしまったのですが、他にいい方法をご存知であれば教えていただけると幸いです