teclado tapar tapa studio quitar ocultar foco edittext desactivar con android keyboard android-edittext android-4.0-ice-cream-sandwich

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