touched - Cómo ocultar el teclado suave de Android en EditText
ocultar teclado android edittext (13)
Tengo una Actividad con algunos campos EditText y algunos botones como una conveniencia para lo que normalmente se usaría para poblar esos campos. Sin embargo, cuando el usuario toca uno de los campos EditText aparece automáticamente el teclado virtual de Android. Quiero que permanezca oculto por defecto, a menos que el usuario presione el botón de menú durante mucho tiempo. Busqué una solución para esto y encontré varias respuestas, pero hasta ahora no puedo hacer que funcionen.
He probado lo siguiente:
1 - En el método onCreate,
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
2 - También en el método onCreate,
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
3 - y fIn el archivo Manifest,
<activity android:name=".activityName" android:windowSoftInputMode="stateAlwaysHidden"/>
Ninguno de estos métodos funciona. Cada vez que el usuario hace clic en el campo EditText, aparece el teclado virtual. Solo quiero que aparezca el teclado virtual si el usuario lo muestra de forma explícita presionando prolongadamente la tecla de menú.
¿Por qué no está funcionando?
A veces uso un truco para hacer exactamente eso. Puse un soporte de foco invisible en algún lugar en la parte superior del diseño. Sería por ejemplo así
<EditText android:id="@id/editInvisibleFocusHolder"
style="@style/InvisibleFocusHolder"/>
con este estilo
<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>
y luego en "Resumir" llamaría
editInvisibleFocusHolder.setInputType(InputType.TYPE_NULL);
editInvisibleFocusHolder.requestFocus();
Eso funciona bien para mí desde 1.6 hasta 4.x
Después de mucho tiempo buscando en la clase TextView, encontré una forma de evitar que aparezca el teclado. El truco es esconderlo justo después de que aparezca, por lo que busqué un método que se llama después de que aparezca el teclado y lo oculté.
Implementé la clase 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);
}
}
y estilo
<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" />
El resultado de mi prueba:
con: editText.setInputType (InputType.TYPE_NULL);
el teclado desaparecerá, pero el cursor también desaparecerá.
con: editText.setShowSoftInputOnFocus (falso)
Funciona como se esperaba.
El teclado EditorInfo.TYPE_NULL
siguió aumentando a pesar de que establecí EditorInfo.TYPE_NULL
en la vista. Ninguna de las respuestas funcionó para mí, excepto la idea que obtuve de la respuesta de nik431:
editText.setCursorVisible(false);
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
Esto te ayudara
editText.setInputType(InputType.TYPE_NULL);
Editar:
Para mostrar el teclado virtual, debe escribir el siguiente código en el 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);
Intentemos establecer las siguientes propiedades en su xml para EditText
android:focusableInTouchMode="true" android:cursorVisible="false".
si desea ocultar el teclado de programación en la actividad de inicio, vaya a este link
La siguiente línea es exactamente lo que se está buscando. Este método se ha incluido con API 21
, por lo tanto, funciona para API 21
y superior.
edittext.setShowSoftInputOnFocus(false);
Ocultar el teclado
editText.setInputType(InputType.TYPE_NULL);
Mostrar teclado
etData.setInputType(InputType.TYPE_CLASS_TEXT);
etData.setFocusableInTouchMode(true);
en el diseño principal
android:focusable="false"
Parece que hay una gran variedad de formas de evitar que aparezca el teclado del sistema, tanto de forma programática como en xml. Sin embargo, esta es la manera que me ha funcionado a la vez que he soportado dispositivos 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);
}
Simplemente use EditText.setFocusable(false);
en actividad
o usar en xml
android:focusable="false"
Tres formas basadas en la misma instrucción simple:
un). Resultados tan fáciles como localizar (1):
android:focusableInTouchMode="true"
entre la configuración de cualquier elemento precedente en el diseño, ejemplo:
si todo tu diseño está compuesto de:
<ImageView>
<EditTextView>
<EditTextView>
<EditTextView>
a continuación, puede escribir el (1) entre los parámetros de ImageView y esto atraerá la atención de Android a ImageView en lugar de EditText.
segundo). En caso de que tenga otro elemento precedente que un ImageView, puede que necesite agregar (2) a (1) como:
android:focusable="true"
do). también puedes simplemente crear un elemento vacío en la parte superior de tus elementos de vista:
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px" />
Esta alternativa hasta este punto resulta ser la más simple de todas que he visto. Espero eso ayude...
necesitas agregar en manifiesto Su archivo de manifiesto se vería así:
<activity
...
android:windowSoftInputMode="stateHidden|adjustResize"
...
>
weekText = (EditText) layout.findViewById(R.id.weekEditText);
weekText.setInputType(InputType.TYPE_NULL);