Как скрыть мягкую клавиатуру Android на EditText

У меня есть 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 - и fВ файле манифеста

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

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

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

Ответ 1

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

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

Ответ 2

вам нужно добавить манифест. Файл манифеста будет выглядеть так:

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

Ответ 3

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

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

Это хорошо работает для меня от 1,6 до 4.x

Ответ 4

После длительного изучения класса 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" />

Ответ 5

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

editText.setCursorVisible(false);
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);

Ответ 6

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

edittext.setShowSoftInputOnFocus(false);

Ответ 7

Кажется, существует целый ряд способов предотвращения появления системной клавиатуры как программно, так и в xml. Тем не менее, это способ, который работал у меня, поддерживая устройства pre 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);
}

Ответ 8

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

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

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

Ответ 9

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

с setInputType:

editText.setInputType(InputType.TYPE_NULL);

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

с setShowSoftInputOnFocus:

editText.setShowSoftInputOnFocus(false)

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

Ответ 10

weekText = (EditText) layout.findViewById(R.id.weekEditText);
weekText.setInputType(InputType.TYPE_NULL);

Ответ 11

Три способа, основанные на одной и той же простой инструкции:

а). Результаты так же легко, как найти (1):

android:focusableInTouchMode="true"

среди конфигурации любого прецедентного элемента в макете, пример:

если весь ваш макет состоит из:

<ImageView>

<EditTextView>

<EditTextView>

<EditTextView>

затем вы можете записать (1) среди параметров ImageView, и это привлечет внимание Android к ImageView вместо EditText.

б). Если у вас есть другой элемент прецедента, кроме ImageView, вам может потребоваться добавить (2) к (1) как:

android:focusable="true"

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

<LinearLayout
  android:focusable="true"
  android:focusableInTouchMode="true"
  android:layout_width="0px"
  android:layout_height="0px" />

Эта альтернатива до этого момента является самой простой из всех, что я видел. Надеюсь, поможет...

Ответ 12

Спрятать клавиатуру

editText.setInputType(InputType.TYPE_NULL);

Показать клавиатуру

etData.setInputType(InputType.TYPE_CLASS_TEXT);
etData.setFocusableInTouchMode(true);

в родительском макете

android:focusable="false"

Ответ 13

Просто используйте EditText.setFocusable(false); в деятельности

или использовать в XML

android:focusable="false"

Ответ 14

Здравствуйте, используйте этот код, он работает на 100% для меня

EditText ee=new EditText(this);
ee.setShowSoftInputOnFocus(false);

* Но вы хотите просто скрыть клавиатуру при нажатии на текст редактирования, приведенный ниже код будет работать, но будет создан значок клавиатуры и знак "назад" вверх * Данный код выглядит следующим образом

        EditText ee=new EditText(this);//create edittext
        final   View.OnTouchListener disable =new View.OnTouchListener() {
        public boolean onTouch (View v, MotionEvent event) {
        v.onTouchEvent(event);
        InputMethodManager img = 
        (InputMethodManager)v.getContext().getSystemService(INPUT_METHOD_SERVICE);
        if (img != null) {
        img.hideSoftInputFromWindow(v.getWindowToken(),0);
        }
        return true;
        }
        };
        //call touch listener
       ee.setOnTouchListener(disable);

Используйте это также в случае текстового слушателя

        EditText ee= new EditText(this);
        Text=new TextWatcher(){

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int 
        after) {
        InputMethodManager img = (InputMethodManager) 
        getSystemService(INPUT_METHOD_SERVICE);
        img.hideSoftInputFromWindow(ee.getWindowToken(), 0);

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        InputMethodManager img = (InputMethodManager) 
        getSystemService(INPUT_METHOD_SERVICE);
        img.hideSoftInputFromWindow(ee.getWindowToken(), 0);

        }
       @Override
        public void afterTextChanged(Editable s) {
        InputMethodManager img = (InputMethodManager) 
        getSystemService(INPUT_METHOD_SERVICE);
        img.hideSoftInputFromWindow(ee.getWindowToken(), 0);

        }
        };
       ee.addTextChangedListener(Text);

Используйте это также в случае слушателя onclick

 EditText ee=new EditText(this);
 ee.setOnClickListener(new View.OnClickListener() {
 public void onClick(View v) {

 InputMethodManager img= (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
 img.hideSoftInputFromWindow(ee.getWindowToken(),0);

 }});

Весь код будет работать, но для меня первый код лучше