Отключить клавиатуру на 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??? Благодарю.
18 ответов
Вот сайт, который даст вам то, что вам нужно
В качестве резюме, он предоставляет ссылки на 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 равен 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
}
});
Надеюсь, что это указывает вам в правильном направлении
Ниже приведен код как для 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);
}
}
Вы также можете использовать 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
}
}
Добавьте следующие свойства к контроллеру Edittext в файле макета
<Edittext
android:focusableInTouchMode="true"
android:cursorVisible="false"
android:focusable="false" />
Я использовал это решение какое-то время, и оно прекрасно работает для меня.
Пытаться: android:editable="false"
или же android:inputType="none"
Отключить клавиатуру (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);
}
См. Этот раздел вопросов и ответов, почему для отмены требуется сложная версия до API 21 setTextIsSelectable(true)
:
Этот ответ должен быть более тщательно проверен.
Я проверил 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);
}
}
}
Собирая решения из нескольких мест здесь, на Stackru, я думаю, что следующее подводит итог:
Если вам не нужно, чтобы клавиатура отображалась где-либо в вашей деятельности, вы можете просто использовать следующие флаги, которые используются для диалогов (полученных отсюда):
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);
Я нашел это решение, которое работает для меня. Он также помещает курсор при нажатии на 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;
}
});
// 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);
Добавить к решению Алексея Кучеренко: проблема с исчезновением курсора после вызова setInputType(0)
из-за ошибки структуры на ICS (и JB).
Ошибка задокументирована здесь: https://code.google.com/p/android/issues/detail?id=27609.
Чтобы обойти это, позвоните setRawInputType(InputType.TYPE_CLASS_TEXT)
сразу после setInputType
вызов.
Чтобы остановить отображение клавиатуры, просто переопределите OnTouchListener
EditText и вернуть истину (проглотив событие касания):
ed.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
Причины появления курсора на устройствах GB, а не на ICS+ заставили меня рвать волосы на пару часов, поэтому я надеюсь, что это сэкономит кому-то время.
Просто установите:
NoImeEditText.setInputType(0);
или в конструкторе:
public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
setInputType(0);
}
Просто поместите эту строку в тег активности в манифесте android:windowSoftInputMode="stateHidden"
Это сработало для меня. Сначала добавьте это android:windowSoftInputMode="stateHidden"
в вашем файле манифеста Android, под вашей деятельностью. как ниже:
<activity ... android:windowSoftInputMode="stateHidden">
Затем в методе 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"
,
Это сделает указатель видимым. Таким образом, клавиатура не будет всплывать при запуске вашей деятельности, а также будет скрыта при нажатии на текст редактирования.
В моем случае эти строки работают для меня...
android:inputType="none"
android:focusableInTouchMode="true"
android:cursorVisible="false"
android:focusable="false"
перед добавлением этих строк, когда я щелкнул по умолчанию, клавиатура editText показала/вызвала.
После добавления этих строк клавиатура не отображалась.
Один из способов отключить клавиатуру в EditText:
binding.InputTextView.showSoftInputOnFocus = false
Для редактирования текста используйте атрибут android:focusable="false"
Не знаю, лучше ли этот ответ, но я нашел возможное более быстрое решение. В XML просто поместите в EditText следующие атрибуты:
android:focusable="true"
android:focusableInTouchMode="false"
А затем делайте то, что вам нужно, с помощью onClickListener.