読者です 読者をやめる 読者になる 読者になる

言いたいことはそれだけか

JavaとかAndroidとか調べたことをメモします。٩( 'ω' )و

TextEditをタップした時にPortraitでも全画面で入力したい

先に言っておくとあまりいい方法は見つかりませんでした。

やりたいこと

タイトルの通り。Landscapeの場合は全画面入力になるので、Portraitでも同じような挙動にしたい
もっと具体的に言うと、Portrait固定かつ画面下部固定で置いているEditTextをタップした場合、

android:windowSoftInputMode="adjustPan"

とか指定するとキーボードに隠れるってことはないんだけどテキストエリアが狭すぎて入力しにくい。
できればお手軽に上記のようはattributeを指定するだけで全画面入力したい。

Landscapeだと全画面で入力できる仕組み

さっそくFrameworkのコードを読んでみましょう。
http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/core/java/android/inputmethodservice/InputMethodService.java#992

    992     /**
    993      * Override this to control when the input method should run in
    994      * fullscreen mode.  The default implementation runs in fullsceen only
    995      * when the screen is in landscape mode.  If you change what
    996      * this returns, you will need to call {@link #updateFullscreenMode()}
    997      * yourself whenever the returned value may have changed to have it
    998      * re-evaluated and applied.
    999      */
   1000     public boolean onEvaluateFullscreenMode() {
   1001         Configuration config = getResources().getConfiguration();
   1002         if (config.orientation != Configuration.ORIENTATION_LANDSCAPE) {
   1003             return false;
   1004         }
   1005         if (mInputEditorInfo != null
   1006                 && (mInputEditorInfo.imeOptions & EditorInfo.IME_FLAG_NO_FULLSCREEN) != 0) {
   1007             return false;
   1008         }
   1009         return true;
   1010     }

残念ながらPortraitの場合はメソッドの頭でreturnされます。
このクラスはInputMethodServiceなので、独自で拡張クラス作れなくはないですが、
ユーザさんにそのIMEを選択してもらう必要があるので本来のやりたいこととは離れてしまいます。

結論

EditTextを全画面に配置する別Fragmentを用意するのが正攻法かなぁ