android - tapar - Deshabilitar el teclado en EditText
teclado android studio (13)
Estoy haciendo una calculadora. Así que hice mis propios Buttons
con números y funciones. La expresión que se debe calcular está en un EditText
, porque quiero que los usuarios puedan agregar números o funciones también en la mitad de la expresión, así que con el EditText
tengo el cursor
. Pero quiero deshabilitar el Keyboard
cuando los usuarios EditText
clic en el texto de EditText
. Encontré este ejemplo que está bien para Android 2.3
, pero con ICS
deshabilita el Keyboard
y también el cursor.
public class NoImeEditText extends EditText {
public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onCheckIsTextEditor() {
return false;
}
}
Y luego uso este NoImeEditText
en mi archivo XML
<com.my.package.NoImeEditText
android:id="@+id/etMy"
....
/>
¿Cómo puedo hacer compatible este EditText con ICS? Gracias.
Deshabilitar el teclado (API 11 a la actual)
Esta es la mejor respuesta que he encontrado hasta ahora para deshabilitar el teclado (y he visto muchos de ellos).
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21
editText.setShowSoftInputOnFocus(false);
} else { // API 11-20
editText.setTextIsSelectable(true);
}
No es necesario utilizar la reflexión o establecer el InputType
en nulo.
Volver a habilitar el teclado
Aquí es cómo volver a habilitar el teclado si es necesario.
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);
}
Consulte esta setTextIsSelectable(true)
preguntas y respuestas para setTextIsSelectable(true)
por qué se necesita la complicada versión pre API 21 para deshacer setTextIsSelectable(true)
:
Esta respuesta necesita ser probada más a fondo.
He probado el setShowSoftInputOnFocus
en dispositivos con API más altos, pero después del comentario de @androiddeveloper que aparece a continuación, veo que esto debe ser probado más a fondo.
Aquí hay un código de cortar y pegar para ayudar a probar esta respuesta. Si puede confirmar que funciona o no para las API 11 a 20, deje un comentario. No tengo ningún dispositivo API 11-20 y mi emulador está teniendo problemas.
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);
}
}
}
Agregue las siguientes propiedades al controlador Edittext en el archivo de diseño
<Edittext
android:focusableInTouchMode="true"
android:cursorVisible="false"
android:focusable="false" />
He estado usando esta solución por un tiempo y funciona bien para mí.
El código a continuación es para API> = 11 y API <11. El cursor todavía está disponible.
/**
* 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);
}
}
Encontré esta solución que funciona para mí. También coloca el cursor, cuando se hace clic en EditarTexto en la posición correcta.
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;
}
});
Esto funcionó para mí. Primero agregue este android:windowSoftInputMode="stateHidden"
en su archivo de manifiesto de Android, bajo su actividad. como abajo:
<activity ... android:windowSoftInputMode="stateHidden">
Luego, en el método onCreate de su actividad, agregue el código de seguimiento:
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;
}
});
Luego, si desea que el puntero sea visible, agregue esto en su xml android:textIsSelectable="true"
.
Esto hará que el puntero sea visible. De esta forma, el teclado no se abrirá cuando comience su actividad y también se ocultará cuando haga clic en el texto de edición.
Para agregar a la solución de Alex Kucherenko: el problema con el cursor que desaparece después de llamar a setInputType(0)
se debe a un error de marco en ICS (y JB).
El error se documenta aquí: https://code.google.com/p/android/issues/detail?id=27609 .
Para solucionar esto, llame a setRawInputType(InputType.TYPE_CLASS_TEXT)
justo después de la llamada a setInputType
.
Para detener la aparición del teclado, simplemente anule OnTouchListener
del EditText y devuelva verdadero (tragando el evento táctil):
ed.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
Las razones por las que aparece el cursor en los dispositivos GB y no en ICS + me hicieron arrancarme el pelo durante un par de horas, así que espero que esto ahorre tiempo a alguien.
Recopilando soluciones de varios lugares aquí en , creo que el siguiente lo resume:
Si no necesita que se muestre el teclado en ninguna parte de su actividad, simplemente puede usar las siguientes banderas que se usan para los diálogos (se obtienen desde here ):
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Si no lo quieres solo para un EditText específico, puedes usar esto (obtuve desde here ):
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;
}
O esto (tomado de here ):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
editText.setShowSoftInputOnFocus(false);
else
editText.setTextIsSelectable(true);
Sólo establece:
NoImeEditText.setInputType(0);
o en el constructor:
public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
setInputType(0);
}
Simplemente coloque esta línea dentro de la etiqueta de actividad en el archivo de comando de android: windowSoftInputMode = "stateHidden"
También puede usar setShowSoftInputOnFocus(boolean) directamente en API 21+ o por reflexión en 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
}
}
prueba: android:editable="false"
o android:inputType="none"
Here hay un sitio web que le dará lo que necesita.
Como resumen, proporciona enlaces a InputMethodManager
y View
from Android Developers. Se referirá a getWindowToken
dentro de View
y hideSoftInputFromWindow()
para InputMethodManager
Una mejor respuesta se da en el enlace, espero que esto ayude.
Aquí hay un ejemplo para consumir el evento 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
}
};
Aquí hay otro ejemplo del mismo sitio web. Esto dice que funciona, pero parece una mala idea, ya que su EditBox es NULL, ya no será un editor:
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
}
});
Espero que esto te apunte en la dirección correcta
// 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);