62
задан 7 July 2012 в 10:59

14 ответов

Здесь веб-сайт, который даст Вам, в чем Вы нуждаетесь

Как сводка, это предоставляет ссылки на InputMethodManager и View от Разработчиков Android. Это сошлется к getWindowToken внутренняя часть View и hideSoftInputFromWindow() для InputMethodManager

А, который лучший ответ дан в ссылке, надежда, которой это помогает.

вот пример для потребления 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
  }
};

Вот другой пример с того же веб-сайта. Это утверждает, что работало, но походит на плохую идею, так как Ваш EditBox является ПУСТЫМ, это больше не будет редактор:

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
  }
});

Hope это указывает на Вас в правильном направлении

46
ответ дан 31 October 2019 в 13:10

Ниже кода оба для 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);
    }
}
61
ответ дан 31 October 2019 в 13:10

попытка: android:editable="false" или android:inputType="none"

21
ответ дан 31 October 2019 в 13:10

Можно также использовать setShowSoftInputOnFocus (булевская переменная) непосредственно на 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
    }
}
19
ответ дан 31 October 2019 в 13:10

Отключите клавиатуру (API 11 к току)

, Это - лучший ответ, который я нашел до сих пор для отключения клавиатуры (и я видел многие из них).

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

нет никакой потребности использовать отражение или установить InputType для обнуления.

Повторно включают клавиатуру

, Вот то, как Вы повторно включаете клавиатуру в случае необходимости.

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);
}

Посмотрите этот Q& для того, почему сложное пред версия API 21 необходимо для отмены setTextIsSelectable(true):

, Этот ответ должен быть более тщательно протестирован.

я протестировал setShowSoftInputOnFocus на более высоких устройствах API, но после комментария @androiddeveloper ниже, я вижу, что это должно быть более тщательно протестировано.

Вот некоторый код вырезания и вклейки, чтобы помочь протестировать этот ответ. Если можно подтвердить, что это делает или не работает на API 11 to 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
ответ дан 31 October 2019 в 13:10

Добавьте ниже свойств к контроллеру Edittext в файле

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

расположения, я использовал это решение для того, в то время как и это хорошо работает для меня.

10
ответ дан 31 October 2019 в 13:10

Я нашел это решение, которое работает на меня. Это также устанавливает курсор, когда 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
ответ дан 31 October 2019 в 13:10

Собирая решения от нескольких мест здесь на StackOverflow, я думаю, что следующий подводит итог его:

, Если Вам не нужна клавиатура, которую покажут где-нибудь на Вашем действии, можно просто использовать следующие флаги, которые используются для диалоговых окон (полученный от здесь ):

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

, Если Вы не хотите это только для определенного EditText, можно использовать это (полученный от здесь ):

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;
}

Или это (взятый от здесь ):

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
           editText.setShowSoftInputOnFocus(false);
       else
           editText.setTextIsSelectable(true); 
6
ответ дан 31 October 2019 в 13:10
// 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
ответ дан 31 October 2019 в 13:10

Просто набор:

 NoImeEditText.setInputType(0);

или в конструкторе:

   public NoImeEditText(Context context, AttributeSet attrs) { 
          super(context, attrs);   
          setInputType(0);
       } 
4
ответ дан 31 October 2019 в 13:10

Добавить к решению Alex Kucherenko: проблема с получением курсора, исчезающим после вызова setInputType(0), происходит из-за ошибки платформы на ICS (и JB).

ошибка документируется здесь: https://code.google.com/p/android/issues/detail? id=27609.

К обходному решению это, звоните setRawInputType(InputType.TYPE_CLASS_TEXT) прямо после эти setInputType вызов.

, Чтобы мешать клавиатуре появиться, просто переопределите OnTouchListener из EditText и возвратите true (глотающий сенсорное событие):

ed.setOnTouchListener(new OnTouchListener() {

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

                return true;
            }
        });

причины курсора, появляющегося на устройствах ГБ а не на ICS +, имели меня отрывающий мои волосы в течение нескольких часов, таким образом, я надеюсь, что это экономит чье-то время.

4
ответ дан 31 October 2019 в 13:10

Это работало на меня. Сначала добавьте это android:windowSoftInputMode="stateHidden" в Вашем файле манифеста андроида при Вашем действии. как ниже:

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

Затем на onCreate методе youractivity, добавьте код foloowing:

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".

Это сделает указатель видимым. Таким образом клавиатура не раскроется, когда Ваше действие запустится и также будет скрыто при нажатии на edittext.

2
ответ дан 31 October 2019 в 13:10
editText.setShowSoftInputOnFocus(false);
2
ответ дан 31 October 2019 в 13:10

Просто поместите эту строку в теге действия в декларации android:windowSoftInputMode = "stateHidden"

1
ответ дан 31 October 2019 в 13:10

Другие вопросы по тегам:

Похожие вопросы: