blitz-time アプリ開発ブログ

Androidアプリ開発などのTips集

【Androidアプリ開発】画面起動時のソフトウェアキーボード(IME)を非表示にしたい

EditTextを使った文字入力を持った画面を表示した場合、そのEditTextに入力フォーカスがあたり、ソフトウェアキーボード(IME)が自動的に起動します。

入力前提の画面であればその挙動が良いのですが、「既存のデータを閲覧し、必要であれば編集する」というような用途の場合、デフォルト動作としてはソフトウェアキーボードは非表示にし、必要であれば編集したい項目をタッチしてソフトウェアキーボードを表示する。というような動作が望ましいかと思います。

ソフトウェアキーボードの自動を起動しないようにするには、Layoutで下記のようにすればできます。

<TextView
	android:id="@+id/tvDate"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:layout_weight="1"
	android:gravity="center_horizontal"
	android:focusable="true"
	android:focusableInTouchMode="true"
	android:text="2019/08/20" >
	<requestFocus />
</TextView>

<EditText
	android:id="@+id/etSubTitle1"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:ems="10"
	android:inputType="textPersonName">
</EditText>

入力項目であるEditTextとは別のTextViewにフォーカスを与えるようにします。TextViewにフォーカスを与えたところで入力可能な項目ではないので、ソフトウェアキーボードは不要となり、表示されることはありません。

しかし、今回は同じアクティビティでデータの有無によって動作を分けたいのです。つまり、
・新規入力の場合はデータ入力が必須なので、画面表示時にソフトウェアキーボードを自動表示
・既存データの表示時は必ずデータ入力が必要というわけではないので、画面表示時のソフトウェアキーボード自動表示はなし
としたいです。この場合、Layoutの定義では行えないので、コードで実装します。

TextView tvDate = findViewById(R.id.tvDate);
tvDate.requestFocus();
tvDate.setFocusable(true);
tvDate.setFocusableInTouchMode(true);

Layoutで定義した内容を実装するだけです。