EditTextでぐぐると「初期表示で出ないようにする」という記事ばかりです。
僕もEditTextを配置したら勝手にキーボードが出て、どうすれば非表示にできるのかググった記憶があります。
しかし、sdk28以降からはEditTextは明示的に表示するよう指定しないとキーボードが出なくなりました。
そこで、この記事ではsdk28、Android9の端末を対象に
- 初期表示でキーボードを表示する
- 画面遷移で戻ってきた後も再びキーボードを表示する
方法を説明します。
sdk28以降のその他の変更点は、次の公式ドキュメントを参考にしてみてください。
動作の変更点: API レベル 28+ をターゲットとするアプリ
https://developer.android.com/about/versions/pie/android-9.0-changes-28?hl=ja
その前に重大な話
世界でのAndroid9の普及率は1%未満、日本でもAndroid9の普及率は10%程度。
Android バージョン別シェアを発表。日本国内のシェア・全体の推移は?
https://moduleapps.com/mobile-marketing/android-ver/
sdk28(Android9)対応なんて後でいいや〜と思っているアナタ!
すぐやらないと大変なことになります。
なぜなら、
- 2019/8までに、新規アプリはsdk28以降が必須
- 2019/11までで、既存アプリもsdk28以降が必須
になるからです。
2019 年のターゲット API レベル要件の拡大について
2019 年 8 月: 新しいアプリで、API レベル 28(Android 9)以上をターゲットとすることが必須になります。
2019 年 11 月: 既存のアプリのアップデートで、API レベル 28 以上をターゲットとすることが必須になります。
この記事執筆時点(2019/7/19)でもうすぐそこまで迫っています。
sdk28にすると動作が変わる部分もありますので、お早めの対応をオススメします。
やりたいことの確認
さて、ではやりたい事を改めて整理します。
「初期表示でキーボードを出したい」のは主に編集画面の時
「遷移先から戻ってきた時のキーボード再表示」は編集画面のオプションから戻ってきた時
によく使うと思います。
拙アプリ「mizutamaTODO」より
動作確認は、Pixel3a (Android9)で行っています。
初期表示でキーボードを出す
最初に言った通り、昔はEditTextを配置しただけで、勝手にキーボードが表示されましたが、targetSdkVersionを28にすると、デフォルトでキーボードが表示されなくなるので、以下の対応が必要になります。
① AndroidManifest.xmlにwindowSoftInputMode追加
まず、AndroidManifest.xmlの対象ActivityにwindowSoftInputModeプロパティを追加します。
<activity android:name=".MainActivity" android:windowSoftInputMode="stateAlwaysVisible">
これだけでAndroid7.1.1のシミュレータではキーボードが表示されましたが、Pixel3aはうんともすんとも言いません。
② EditTextにfocusを当てる
次に、onCreateで編集対象のEditTextにフォーカスを当てます。
editText.requestFocus()
これで「キーボードの初期表示」と「遷移先から戻ってきた時のキーボード再表示」ができるようになります。
応用編
「初期表示ではキーボードは出したく無い」けど
- 何かしらのタイミングで編集モードになってキーボードを出し
- オプション画面に遷移(キーボードが自動で閉じる)した後
- 戻ってきた時、キーボードを再表示したい
という場合もあります。(ありました)
その時、初期表示ではキーボードを出したくないので、AndroidManifestの対象Activityには
<activity android:name=".MainActivity" android:windowSoftInputMode="stateHidden">
と記述して(“stateHidden”に注目!)
編集モードに入るタイミングと、遷移先から戻ってきたタイミングで、次のキーボードを表示する処理を呼びます。
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_NOT_ALWAYS)
EditTextへのrequestForcus()は必要ありません。
AndroidManifest.xmlへ「windowSoftInputMode=”stateHidden”」の記述を入れ忘れた場合「編集モードに入るタイミングの最初のキーボード呼び出しは動作します」が、遷移先から戻ってきたときの「キーボードの再表示は動作しない」ので注意してください(これにハマった…)
twitterでも毎日開発情報をつぶやいていますので、フォロー宜しくお願い致します。