LoginSignup
3
2

More than 5 years have passed since last update.

ソフトキーボードを表示せずにEditTextを使う

Posted at

先日、電卓のように自前のキーボードを持つアプリで、EditTextを使用してユーザ入力を受けるようにすると、ソフトキーボードが表示されてしまうのでTextViewを使用したという話を聞きました。ちょっとググったところでは、アプリ起動時にフォーカスがあたっていても表示しないとか、フォーカスが外れた時に非表示にするとか、その辺しか引っかからなかったので、よくある電卓アプリでは、どうやってキーボード表示しないようにしているのかと思い試してみました。

TL;DR

やることは3つ。

  1. AndroidManifestの修正
  2. EditTextを継承したクラスの作成
  3. レイアウトファイルの書き換え

環境

実機確認はAndroid4.4.4で行いました。

エミュレータではAPI19/23/25で確認しました。

AndroidManifestの修正

<activity>android:windowSoftInputMode="stateAlwaysHidden"を追加します。

これはアプリ起動時にフォーカスがあたっていてもキーボードを表示しないようにするためです。

EditTextを継承したクラスの作成

EditTextを継承したCustomEditTextクラスでイベントをオーバーライドします。

CustomEditText.java
public class CustomEditText extends EditText {
  public CustomEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    setCustomSelectionActionModeCallback(new NoSelectionMode());
  }

  @Override public boolean onTouchEvent(MotionEvent event) {
    if (event.getActionMasked() == MotionEvent.ACTION_UP) {
      // タップ時のキーボード表示抑止
      cancelLongPress();
    }
    return super.onTouchEvent(event);
  }

  @Override public boolean performLongClick() {
    // ロングタップ時のキーボード表示抑止
    return true;
  }

  static class NoSelectionMode implements ActionMode.Callback {
    @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) {
      // ダブルタップ時のキーボード表示抑止
      return false;
    }

    @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
      return false;
    }

    @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
      return false;
    }

    @Override public void onDestroyActionMode(ActionMode mode) {
    }
  }
}

レイアウトファイル

あとはEditTextを使用しているところをCustomEditTextに書き換えます。

  <com.example.customedit.noshowkeyboard.CustomEditText
      android:id="@+id/custom_edit_text"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:inputType="text"
      android:hint="no show"
      />

注意事項

  • エミュレータAPI19と実機ではandroid:hintに書いた文字がグレーではなく、黒で表示されました。他の環境ではグレーで表示されていたので、API19の問題かもしれませんが調べていません。
  • APIバージョンによりダブルタップ、ロングタップ時に入力済みテキストが選択状態になる/ならないなど細かい違いがあります。その辺りまで同じ動きにしようとするなら、オーバーライドしたメソッドに適切な処理を書けばいいのだと思いますが確認していません。

参考

マニフェストの記述はこちらを参考にしました。

あとがき

キーボード表示済みの状態でCustomEditTextにフォーカスをあてても、キーボードを非表示にはしません。そういったことも実現したい場合は、ソフトキーボードを非表示にする方法などを参考にしてください。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2