1. afj

    Posted

    afj
Changes in title
+ソフトキーボードを表示せずにEditTextを使う
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,86 @@
+先日、電卓のように自前のキーボードを持つアプリで、EditTextを使用してユーザ入力を受けるようにすると、ソフトキーボードが表示されてしまうのでTextViewを使用したという話を聞きました。ちょっとググったところでは、アプリ起動時にフォーカスがあたっていても表示しないとか、フォーカスが外れた時に非表示にするとか、その辺しか引っかからなかったので、よくある電卓アプリでは、どうやってキーボード表示しないようにしているのかと思い試してみました。
+
+# TL;DR
+やることは3つ。
+
+1. AndroidManifestの修正
+1. EditTextを継承したクラスの作成
+1. レイアウトファイルの書き換え
+
+# 環境
+実機確認はAndroid4.4.4で行いました。
+
+エミュレータではAPI19/23/25で確認しました。
+
+# AndroidManifestの修正
+`<activity>`に`android:windowSoftInputMode="stateAlwaysHidden"`を追加します。
+
+これはアプリ起動時にフォーカスがあたっていてもキーボードを表示しないようにするためです。
+
+# EditTextを継承したクラスの作成
+EditTextを継承したCustomEditTextクラスでイベントをオーバーライドします。
+
+```java: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に書き換えます。
+
+```xml
+ <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バージョンによりダブルタップ、ロングタップ時に入力済みテキストが選択状態になる/ならないなど細かい違いがあります。その辺りまで同じ動きにしようとするなら、オーバーライドしたメソッドに適切な処理を書けばいいのだと思いますが確認していません。
+
+# 参考
+マニフェストの記述はこちらを参考にしました。
+
+http://qiita.com/hishida/items/8bf1aa28ef62ef22a7f9
+
+# あとがき
+キーボード表示済みの状態でCustomEditTextにフォーカスをあてても、キーボードを非表示にはしません。そういったことも実現したい場合は、[ソフトキーボードを非表示にする方法](http://techbooster.org/android/ui/7427/)などを参考にしてください。