web-dev-qa-db-ja.com

EditTextでキーボードを無効にします

私は電卓をやっています。そこで、数字と関数を使って独自のButtonsを作成しました。計算する必要がある式はEditTextにあります。ユーザーが式の途中でも数字や関数を追加できるようにするためです。したがって、EditTextにはcursor 。しかし、ユーザーがKeyboardをクリックすると、EditTextを無効にしたいと思います。この例では、Android 2.3、ただしICSを使用すると、Keyboardおよびカーソルも無効になります。

public class NoImeEditText extends EditText {

   public NoImeEditText(Context context, AttributeSet attrs) { 
      super(context, attrs);     
   }   

   @Override      
   public boolean onCheckIsTextEditor() {   
       return false;     
   }         
}

そして、NoImeEditTextファイルでこのXMLを使用します

<com.my.package.NoImeEditText
      Android:id="@+id/etMy"
 ....  
/>

このEditTextをICSと互換性のあるものにする方法ありがとう。

61
Ferox

ここ は、必要なものを提供するWebサイトです

要約すると、Android開発者からのInputMethodManagerおよびViewへのリンクを提供します。getWindowToken内のViewを参照し、 InputMethodManagerhideSoftInputFromWindow()

より良い回答がリンクに記載されています。これが役立つことを願っています。

onTouchイベントを消費する例を次に示します。

editText_input_field.setOnTouchListener(otl);

private OnTouchListener otl = new OnTouchListener() {
  public boolean onTouch (View v, MotionEvent event) {
        return true; // the listener has consumed the event
  }
};

同じWebサイトの別の例を次に示します。これは機能すると主張していますが、EditBoxがNULLであるため、もはやエディターではなくなるため、悪い考えのようです:

MyEditor.setOnTouchListener(new OnTouchListener(){

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    int inType = MyEditor.getInputType(); // backup the input type
    MyEditor.setInputType(InputType.TYPE_NULL); // disable soft input
    MyEditor.onTouchEvent(event); // call native handler
    MyEditor.setInputType(inType); // restore input type
    return true; // consume touch even
  }
});

これがあなたを正しい方向に向けることを願っています

44
Hip Hip Array

以下のコードは、API> = 11とAPI <11の両方の場合です。カーソルは引き続き使用可能です。

/**
 * Disable soft keyboard from appearing, use in conjunction with Android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
 * @param editText
 */
public static void disableSoftInputFromAppearing(EditText editText) {
    if (Build.VERSION.SDK_INT >= 11) {
        editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
        editText.setTextIsSelectable(true);
    } else {
        editText.setRawInputType(InputType.TYPE_NULL);
        editText.setFocusable(true);
    }
}
60

試してください:Android:editable="false" または Android:inputType="none"

21
K_Anas

setShowSoftInputOnFocus(boolean) をAPI 21+で直接使用することも、API 14+でリフレクションを使用して使用することもできます。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    editText.setShowSoftInputOnFocus(false);
} else {
    try {
        final Method method = EditText.class.getMethod(
                "setShowSoftInputOnFocus"
                , new Class[]{boolean.class});
        method.setAccessible(true);
        method.invoke(editText, false);
    } catch (Exception e) {
        // ignore
    }
}
17
kuelye

キーボードを無効にします(現在のAPI 11)

これは、これまでキーボードを無効にするために見つけた最良の答えです(そして、私はそれらの多くを見てきました)。

_if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
    editText.setShowSoftInputOnFocus(false);
} else { // API 11-20
    editText.setTextIsSelectable(true);
}
_

リフレクションを使用したり、InputTypeをnullに設定したりする必要はありません。

キーボードを再度有効にします

必要に応じてキーボードを再度有効にする方法を次に示します。

_if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
    editText.setShowSoftInputOnFocus(true);
} else { // API 11-20
    editText.setTextIsSelectable(false);
    editText.setFocusable(true);
    editText.setFocusableInTouchMode(true);
    editText.setClickable(true);
    editText.setLongClickable(true);
    editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
    editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
}
_

setTextIsSelectable(true)を取り消すには複雑なAPI 21以前のバージョンが必要な理由については、このQ&Aをご覧ください。

この答えは、より徹底的にテストする必要があります。

setShowSoftInputOnFocusを上位のAPIデバイスでテストしましたが、以下の@androiddeveloperのコメントの後、これをより徹底的にテストする必要があることがわかりました。

この回答をテストするのに役立つカットアンドペーストコードを次に示します。 API 11〜20で機能するかどうかを確認できる場合は、コメントを残してください。 API 11-20デバイスがなく、エミュレータに問題があります。

activity_main.xml

_<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/activity_main"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="@dimen/activity_vertical_margin"
    Android:paddingLeft="@dimen/activity_horizontal_margin"
    Android:paddingRight="@dimen/activity_horizontal_margin"
    Android:paddingTop="@dimen/activity_vertical_margin"
    Android:orientation="vertical"
    Android:background="@Android:color/white">

    <EditText
        Android:id="@+id/editText"
        Android:textColor="@Android:color/black"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"/>

    <Button
        Android:text="enable keyboard"
        Android:onClick="enableButtonClick"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>

    <Button
        Android:text="disable keyboard"
        Android:onClick="disableButtonClick"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>
</LinearLayout>
_

MainActivity.Java

_public class MainActivity extends AppCompatActivity {

    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText);
    }

    // when keyboard is hidden it should appear when editText is clicked
    public void enableButtonClick(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
            editText.setShowSoftInputOnFocus(true);
        } else { // API 11-20
            editText.setTextIsSelectable(false);
            editText.setFocusable(true);
            editText.setFocusableInTouchMode(true);
            editText.setClickable(true);
            editText.setLongClickable(true);
            editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
            editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
        }
    }

    // when keyboard is hidden it shouldn't respond when editText is clicked
    public void disableButtonClick(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { // API 21
            editText.setShowSoftInputOnFocus(false);
        } else { // API 11-20
            editText.setTextIsSelectable(true);
        }
    }
}
_
12
Suragch

以下のプロパティをレイアウトファイルのEdittextコントローラーに追加します

<Edittext
   Android:focusableInTouchMode="true"
   Android:cursorVisible="false"
   Android:focusable="false"  />

私はしばらくの間このソリューションを使用してきましたが、私にとってはうまく機能します。

10
Nishara MJ

StackOverflowの複数の場所からソリューションを収集しているので、次のものはそれを要約していると思います。

アクティビティのどこにでもキーボードを表示する必要がない場合は、ダイアログに使用される次のフラグを使用できます( here ):

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

特定のEditTextにのみ使用したくない場合は、これを使用できます( here から取得):

public static boolean disableKeyboardForEditText(@NonNull EditText editText) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        editText.setShowSoftInputOnFocus(false);
        return true;
    }
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
        try {
            final Method method = EditText.class.getMethod("setShowSoftInputOnFocus", new Class[]{boolean.class});
            method.setAccessible(true);
            method.invoke(editText, false);
            return true;
        } catch (Exception ignored) {
        }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
        try {
            Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
            method.setAccessible(true);
            method.invoke(editText, false);
            return true;
        } catch (Exception ignored) {
        }
    return false;
}

または、これ( here から取得):=

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
           editText.setShowSoftInputOnFocus(false);
       else
           editText.setTextIsSelectable(true); 
6

私はこの解決策を見つけました。また、EditTextの正しい位置をクリックすると、カーソルが配置されます。

EditText editText = (EditText)findViewById(R.id.edit_mine);
// set OnTouchListener to consume the touch event
editText.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            v.onTouchEvent(event);   // handle the event first
            InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);  // hide the soft keyboard 
            }                
            return true;
        }
    });
6
Vijay
// only if you completely want to disable keyboard for 
// that particular edit text
your_edit_text = (EditText) findViewById(R.id.editText_1);
your_edit_text.setInputType(InputType.TYPE_NULL);
5
Abel Terefe

設定するだけ:

 NoImeEditText.setInputType(0);

またはコンストラクター内:

   public NoImeEditText(Context context, AttributeSet attrs) { 
          super(context, attrs);   
          setInputType(0);
       } 
4
Alex Kucherenko

Alex Kucherenkoのソリューションに追加するには、setInputType(0)を呼び出した後にカーソルが消える問題は、ICS(およびJB))のフレームワークのバグが原因です。

バグはここに文書化されています: https://code.google.com/p/Android/issues/detail?id=27609

これを回避するには、setInputType呼び出しの直後にsetRawInputType(InputType.TYPE_CLASS_TEXT)を呼び出します。

キーボードの表示を停止するには、EditTextのOnTouchListenerをオーバーライドし、trueを返します(タッチイベントを飲み込みます)。

ed.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                return true;
            }
        });

ICS +ではなくGBデバイスにカーソルが表示される理由により、数時間髪を引き裂くことができたので、これが誰かの時間を節約することを願っています。

3
Jay Sidri

これは私のために働いた。最初にこれを追加しますAndroid:windowSoftInputMode="stateHidden" Androidマニフェストファイル、アクティビティの下。以下のように:

<activity ... Android:windowSoftInputMode="stateHidden">

次に、youractivityのonCreateメソッドで、次のコードを追加します。

EditText editText = (EditText)findViewById(R.id.edit_text);
edit_text.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        InputMethodManager inputMethod = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputMethod!= null) {
            inputMethod.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }                
        return true;
    }
});

次に、ポインタを表示する場合は、xmlにこれを追加しますAndroid:textIsSelectable="true"

これにより、ポインターが表示されます。この方法では、アクティビティの開始時にキーボードがポップアップせず、編集テキストをクリックしたときにも非表示になります。

2
Jerin A Mathews
editText.setShowSoftInputOnFocus(false);
1
Kanagalingam

マニフェストAndroid:windowSoftInputMode = "stateHidden"のアクティビティタグ内にこの行を配置するだけです。

1
mahmoud alaa