Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@afj

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

More than 3 years have passed since last update.

先日、電卓のように自前のキーボードを持つアプリで、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にフォーカスをあてても、キーボードを非表示にはしません。そういったことも実現したい場合は、ソフトキーボードを非表示にする方法などを参考にしてください。

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?