Как спрятать программную клавиатуру Android на EditText - PullRequest
46 голосов
/ 25 января 2012

У меня есть Activity с некоторыми полями EditText и несколькими кнопками для удобства, которые обычно используются для заполнения этих полей.Однако, когда пользователь касается одного из полей EditText, автоматически появляется программная клавиатура Android.Я хочу, чтобы он оставался скрытым по умолчанию, , если пользователь долго не нажимает кнопку меню.Я нашел решение для этого и нашел несколько ответов, но пока не могу заставить их работать.

Я пробовал следующее:

1 - В методе onCreate,

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

2 - Также в методе onCreate

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);

3 - и в файле манифеста

<activity android:name=".activityName" android:windowSoftInputMode="stateAlwaysHidden"/>

Ни один из этих методов не работает.Всякий раз, когда пользователь нажимает на поле EditText, появляется программная клавиатура.Я хочу, чтобы экранная клавиатура появлялась только в том случае, если пользователь явно показывает ее, долгое нажатие клавиши меню.

Почему это не работает?

Ответы [ 16 ]

85 голосов
/ 25 января 2012

Это поможет вам

editText.setInputType(InputType.TYPE_NULL);

Редактировать:

Чтобы показать программную клавиатуру, вы должны написать следующий код в long key press event of menu button

editText.setInputType(InputType.TYPE_CLASS_TEXT);
            editText.requestFocus();
            InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            mgr.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
31 голосов
/ 21 августа 2013

Вам необходимо добавить следующий атрибут для Activity в вашем AndroidManifest.xml.

<activity
    ...
    android:windowSoftInputMode="stateHidden|adjustResize"
    ...
/>
8 голосов
/ 25 января 2012

Я иногда использую небольшую хитрость, чтобы сделать это.Я поместил невидимый держатель фокуса где-то в верхней части макета.Например,

 <EditText android:id="@id/editInvisibleFocusHolder"
          style="@style/InvisibleFocusHolder"/>

с этим стилем

<style name="InvisibleFocusHolder">
    <item name="android:layout_width">0dp</item>
    <item name="android:layout_height">0dp</item>
    <item name="android:focusable">true</item>
    <item name="android:focusableInTouchMode">true</item>
    <item name="android:inputType">none</item>
</style>

, а затем в onResume я бы назвал

    editInvisibleFocusHolder.setInputType(InputType.TYPE_NULL);
    editInvisibleFocusHolder.requestFocus();

.до 4.x

7 голосов
/ 31 января 2014

После долгого изучения класса TextView я нашел способ предотвратить появление клавиатуры. Хитрость заключается в том, чтобы скрыть его сразу после его появления, поэтому я искал метод, который вызывается после появления клавиатуры, и скрывал его.

Реализован класс EditText

public class NoImeEditText extends EditText {

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

    /**
     * This method is called before keyboard appears when text is selected.
     * So just hide the keyboard
     * @return
     */
    @Override
    public boolean onCheckIsTextEditor() {
        hideKeyboard();

        return super.onCheckIsTextEditor();
    }

    /**
     * This methdod is called when text selection is changed, so hide keyboard to prevent it to appear
     * @param selStart
     * @param selEnd
     */
    @Override
    protected void onSelectionChanged(int selStart, int selEnd) {
        super.onSelectionChanged(selStart, selEnd);

        hideKeyboard();
    }

    private void hideKeyboard(){
        InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getWindowToken(), 0);
    }
}

и стиль

<com.my.app.CustomViews.NoImeEditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:editable="false"
    android:background="@null"
    android:textSize="@dimen/cell_text" />
6 голосов
/ 20 октября 2015

Программная клавиатура продолжала подниматься, хотя я установил EditorInfo.TYPE_NULL на вид.Ни один из ответов не сработал для меня, кроме идеи, полученной из ответа nik431:

editText.setCursorVisible(false);
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
2 голосов
/ 06 июня 2018

Мой результат теста:

с setInputType:

editText.setInputType(InputType.TYPE_NULL);

программная клавиатура исчезает, но курсор также исчезает.

с setShowSoftInputOnFocus:

editText.setShowSoftInputOnFocus(false)

Работает как положено.

2 голосов
/ 26 ноября 2016

Кажется, существует множество способов предотвратить появление системной клавиатуры, как программно, так и в xml. Тем не менее, именно так я работал, поддерживая устройства до API 11.

// prevent system keyboard from appearing
if (android.os.Build.VERSION.SDK_INT >= 11) {
    editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
    editText.setTextIsSelectable(true);
} else {
    editText.setRawInputType(InputType.TYPE_NULL);
    editText.setFocusable(true);
}
2 голосов
/ 04 мая 2015

Следующая строка - именно то, что ищется. Этот метод был включен в API 21, поэтому он работает для API 21 и выше.

edittext.setShowSoftInputOnFocus(false);
1 голос
/ 25 января 2012

Давайте попробуем установить следующие свойства в вашем xml для EditText

android:focusableInTouchMode="true" android:cursorVisible="false".

если вы хотите скрыть программную клавиатуру при запуске, перейдите по этой ссылке

0 голосов
/ 24 апреля 2019
   public class NonKeyboardEditText extends AppCompatEditText {

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

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

и добавьте

NonKeyboardEditText.setTextIsSelectable(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...