Как скрыть мягкую клавиатуру 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);
}});
Весь код будет работать, но для меня первый код лучше