Android

Android「sdk28でEditTextのキーボード初期表示が出来なくなった」の解決方法

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%程度。

AndroidStudioで見れる、バージョンごとの普及率

 

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 以上をターゲットとすることが必須になります。

https://developers-jp.googleblog.com/2019/03/2019-api.html

この記事執筆時点(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()

これで「キーボードの初期表示」と「遷移先から戻ってきた時のキーボード再表示」ができるようになります。

 

応用編

「初期表示ではキーボードは出したく無い」けど

  1. 何かしらのタイミングで編集モードになってキーボードを出し
  2. オプション画面に遷移(キーボードが自動で閉じる)した後
  3. 戻ってきた時、キーボードを再表示したい

という場合もあります。(ありました)

 

その時、初期表示ではキーボードを出したくないので、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でも毎日開発情報をつぶやいていますので、フォロー宜しくお願い致します。