Deshabilitar el teclado en EditText

Estoy haciendo una calculadora. Así que hice mis propios Buttons con números y funciones. La expresión que tiene que calcularse está en un EditText , porque quiero que los usuarios puedan agregar números o funciones también en el medio de la expresión, así que con EditText tengo el cursor . Pero quiero desactivar el Keyboard cuando los usuarios hacen clic en EditText . Encontré este ejemplo que está bien para Android 2.3 , pero con ICS desactiva 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

  

¿Cómo puedo hacer compatible este EditText con ICS ??? Gracias.

Aquí hay un sitio web que le dará lo que necesita

Como resumen, proporciona enlaces a InputMethodManager y View from Android Developers. Hará referencia 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); // restre input type return true; // consume touch even } }); 

Espero que esto te indique la dirección correcta

El código siguiente es para API> = 11 y API <11. El cursor aún 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); } } 

try: android:editable="false" o android:inputType="none"

También puede usar setShowSoftInputOnFocus (boolean) directamente en la API 21+ o mediante la reflexión sobre la 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 } } 

Deshabilitar el teclado (API 11 a la actual)

Esta es la mejor respuesta que he encontrado hasta ahora para desactivar 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 InputType en nulo.

Reactivar el teclado

Aquí es cómo vuelve 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 pregunta y respuesta sobre por qué es necesaria la complicada versión pre API 21 para deshacer setTextIsSelectable(true) :

  • Cómo habilitar el teclado en el tacto después de desactivarlo con setTextIsSelectable

Esta respuesta debe ser probada más a fondo.

He probado el setShowSoftInputOnFocus en dispositivos con API más alta, pero después del comentario de @androiddeveloper 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 API 11 a 20, deje un comentario. No tengo ningún dispositivo API 11-20 y mi emulador está teniendo problemas.

activity_main.xml

       

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

Encontré esta solución que funciona para mí. También coloca el cursor, cuando se hace clic en EditText 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; } }); 

Recostackndo soluciones de varios lugares aquí en StackOverflow, creo que el siguiente lo resume:

Si no necesita que se muestre el teclado en ninguna parte de su actividad, simplemente puede usar los siguientes indicadores que se usan para los diálogos (obtenidos de aquí ):

  getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

Si no lo quiere solo para un EditText específico, puede usar esto (obtenido desde aquí ):

 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 aquí ):

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) editText.setShowSoftInputOnFocus(false); else editText.setTextIsSelectable(true); 

Solo establece:

  NoImeEditText.setInputType(0); 

o en el constructor:

  public NoImeEditText(Context context, AttributeSet attrs) { super(context, attrs); setInputType(0); } 

Agregue las propiedades siguientes al controlador Edittext en el archivo de diseño

  

He estado usando esta solución por un tiempo y funciona bien para mí.

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 estructura en ICS (y JB).

El error está documentado 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 setInputType .

Para evitar que aparezca el teclado, simplemente anule OnTouchListener de EditText y devuelva true (tragando el evento táctil):

 ed.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); 

Las razones por las que el cursor aparece en los dispositivos GB y no en ICS + me hicieron perder el pelo por un par de horas, así que espero que esto le ahorre tiempo a alguien.

Esto funcionó para mí. Primero agregue este android:windowSoftInputMode="stateHidden" en su archivo de manifiesto de Android, bajo su actividad. como abajo:

  

Luego, en el método de creatividad onCreate, agregue el código de foloowing:

 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 aparecerá cuando comience su actividad y también se ocultará cuando haga clic en el texto de edición.

Simplemente ponga esta línea dentro de la etiqueta de actividad en manifest android: windowSoftInputMode = “stateHidden”