¿Cómo deshabilitar la ventana emergente del teclado cuando está en edittext?

85

En mi aplicación, la primera vista de todas mis pantallas es un EditText, por lo que cada vez que voy a una pantalla, aparece el teclado en pantalla. ¿Cómo puedo deshabilitar esta ventana emergente y habilitarla cuando hago clic manualmente en EditText?

    eT = (EditText) findViewById(R.id.searchAutoCompleteTextView_feed);

    eT.setOnFocusChangeListener(new OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {

            if(hasFocus){
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
            imm.hideSoftInputFromWindow(eT.getWindowToken(), 0);
            }
        }
    });

código xml:

<ImageView
    android:id="@+id/feedPageLogo"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:src="@drawable/wic_logo_small" />

<Button
    android:id="@+id/goButton_feed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:text="@string/go" />

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/goButton_feed"
    android:layout_toRightOf="@id/feedPageLogo"
    android:hint="@string/search" />

<TextView
    android:id="@+id/feedLabel"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/feedPageLogo"
    android:gravity="center_vertical|center_horizontal"
    android:text="@string/feed"
    android:textColor="@color/white" />

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ButtonsLayout_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <Button
        android:id="@+id/feedButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/feed"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/iWantButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/iwant"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/shareButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/share"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/profileButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/profile"
        android:textColor="@color/black" />
</LinearLayout>

<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/feedListView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_above="@id/ButtonsLayout_feed"
    android:layout_below="@id/feedLabel"
    android:textSize="15dp" >
</ListView>

la tercera vista (EditText) es donde está el foco.

Mosca doméstica
fuente
¿Puedes publicar tu código xml?
user1213202

Respuestas:

178

La mejor solución se encuentra en el archivo de manifiesto del proyecto (AndroidManifest.xml) , agregue el siguiente atributo en la activityconstrucción

android: windowSoftInputMode = "stateHidden"


Ejemplo:

    <activity android:name=".MainActivity" 
              android:windowSoftInputMode="stateHidden" />

Descripción:

  • El estado del teclado virtual, ya sea oculto o visible, cuando la actividad se convierte en el foco de atención del usuario.
  • El ajuste realizado en la ventana principal de la actividad, ya sea que se reduzca su tamaño para dejar espacio para el teclado virtual o si su contenido se desplaza para hacer visible el foco actual cuando parte de la ventana está cubierta por el teclado virtual.

Introducido en:

  • Nivel API 3.

Enlace a los documentos

Nota: Los valores establecidos aquí (distintos de "stateUnspecified" y "adjustUnspecified") anulan los valores establecidos en el tema.

Skynet
fuente
3
Este enfoque falla si tiene una combinación de campos de texto en la actividad, algunos para los que desea tener un teclado y otros para los que no. Vea mi respuesta sobre cómo se puede lograr esto por campo de texto en tal escenario.
lema 621
@ slogan621por favor, dedique un momento a comprender la pregunta aquí. ¡Estás en una tangente diferente!
Skynet
1
no funciona cuando abro mi aplicación desde reciente.
Mohd Naushad
83

Tienes que crear una vista, encima de EditText, que tenga un enfoque 'falso':

Algo como :

<!-- Stop auto focussing the EditText -->
<LinearLayout
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@android:color/transparent"
    android:focusable="true"
    android:focusableInTouchMode="true">
</LinearLayout>

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:inputType="text" />

En este caso, utilicé LinearLayout para solicitar el enfoque. Espero que esto ayude.

Esto funcionó perfectamente ... gracias a Zaggo0

Mosca doméstica
fuente
26
Agregar una vista inútil es una solución subóptima en comparación con agregar android: windowSoftInputMode = "stateHidden" a la entrada del manifiesto de la actividad.
Chris Horner
@ChrisHorner en ambos debe especificar la actividad o el diseño ... es lo mismo molesto ... ambos funcionan bien para esta solución.
Nicolas Jafelle
2
¡Probé todas las soluciones y esta es la única que funciona correctamente! gracias claro y simple
alfo888_ibg
Agregar una vista inútil no es una buena idea como dijo @ChrisHorner, mejor agregue un atributo en el archivo Manifest como lo sugirió o agregue esta línea de código en su actividad InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
aB9
1
¡Qué mala implementación de la jerarquía de vistas! Creo que esto debería evitarse si es posible.
sud007
43
     edittext.setShowSoftInputOnFocus(false);

Ahora puede utilizar cualquier teclado personalizado que desee.

Mateo556
fuente
Gracias, esta es la única solución aquí que funciona para mí + es corta y fácil.
Max O.21 de
20
está disponible desde el nivel API 21
Jithu PS
Esto es lo que estaba buscando.
Sanjay Joshi
@ JithuP.S, ¿por qué está trabajando en titanio Karbon, cuyo nivel de API es 19?
尤金寶 漢子
23

La gente ha sugerido muchas soluciones excelentes aquí, pero utilicé esta técnica simple con mi EditText (no se requiere nada en java y AnroidManifest.xml). Simplemente configure su focusable y focusableInTouchMode en falso directamente en EditText.

 <EditText
        android:id="@+id/text_pin"
        android:layout_width="136dp"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:textAlignment="center"
        android:inputType="numberPassword"
        android:password="true"
        android:textSize="24dp"
        android:focusable="false"
        android:focusableInTouchMode="false"/>

Mi intención aquí es usar este cuadro de edición en la actividad de bloqueo de la aplicación donde le pido al usuario que ingrese el PIN y quiero mostrar mi teclado de PIN personalizado. Probado con minSdk = 8 y maxSdk = 23 en Android Studio 2.1

ingrese la descripción de la imagen aquí

AB
fuente
esto hizo mi vida más fácil stackoverflow.com/questions/9577304/…
Mohammed mansoor
20

Agregue el siguiente código en su clase de actividad.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

El teclado aparecerá cuando el usuario haga clic en EditText

Sonia John Kavery
fuente
9

Puede utilizar el siguiente código para deshabilitar el teclado en pantalla.

InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Lucifer
fuente
1
y puedo habilitarlo nuevamente usando EditText.onClick (im.unhideSoftInputFromWindow (editText.getWindowToken (), 0);) o algo así?
Mosca doméstica
8

Dos soluciones simples:

La primera solución se agrega debajo de la línea de código en el archivo de manifiesto xml. En el archivo de manifiesto (AndroidManifest.xml), agregue el siguiente atributo en la construcción de actividad

android: windowSoftInputMode = "stateHidden"

Ejemplo:

<activity android:name=".MainActivity" 
          android:windowSoftInputMode="stateHidden" />

La segunda solución es agregar la siguiente línea de código en la actividad

//Block auto opening keyboard  
  this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Podemos usar cualquiera de las soluciones anteriores. Gracias

kgsharathkumar
fuente
5

Declare la variable global para InputMethodManager:

 private InputMethodManager im ;

En onCreate () defínalo:

 im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
 im.hideSoftInputFromWindow(youredittext.getWindowToken(), 0);

Establezca onClickListener en ese texto de edición dentro de oncreate ():

 youredittext.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        im.showSoftInput(youredittext, InputMethodManager.SHOW_IMPLICIT);
    }
});

Esto funcionará.

AndroGeek
fuente
Publique su código. ¿Qué obtienes mientras ejecutas?
AndroGeek
todo el código está en la pregunta, el teclado en pantalla no aparece cuando hago clic en el texto de edición
Housefly
¿Está probando esto usando un emulador o un dispositivo? Si lo está probando con un emulador, no obtendrá las teclas programables. Pruébelo usando un dispositivo. Funcionará.
AndroGeek
sí, estoy usando un dispositivo para probar
Housefly
Hmmm eso es extraño. Si pudiera publicar su código, el método en el que ha escrito, podría ser de alguna ayuda. De lo contrario, el código anterior funciona absolutamente bien en mi dispositivo.
AndroGeek
4

Use el siguiente código, escríbalo debajo onCreate()

InputMethodManager inputManager = (InputMethodManager)
                                   getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                   InputMethodManager.HIDE_NOT_ALWAYS);         
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Dharmaraj Patil
fuente
4

Pruébalo ... Resuelvo este problema usando el código: -

EditText inputArea;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
inputArea = (EditText) findViewById(R.id.inputArea);

//This line is you answer.Its unable your click ability in this Edit Text
//just write
inputArea.setInputType(0);
}

nada que pueda ingresar con la calculadora predeterminada en cualquier cosa, pero puede establecer cualquier cadena.

intentalo

SMFazle Rabbi
fuente
3

Gracias @AB por una buena solución

    android:focusableInTouchMode="false"

En este caso, si desactivará el teclado en la edición de texto, simplemente agregue android: focusableInTouchMode = "false" en el lema de edición de texto .

funciona para mí en Android Studio 3.0.1 minsdk 16, maxsdk26

NZXT
fuente
1
¿Es este un comentario a A.Bla respuesta? ¿O es una respuesta a la pregunta original? Si este es un comentario para A.Bla respuesta, entonces debe usar la opción de comentario proporcionada por StackOverflow y eliminar esta respuesta a la pregunta original.
David Walschots
lo siento si no entendí para responder la respuesta resuelta. Doy las gracias a AB por una buena respuesta para aclarar mi problema ... si me equivoco, puedo eliminar esa respuesta, lo siento @DavidWalschots.
NZXT
2

Prueba con esto:

EditText yourEditText= (EditText) findViewById(R.id.yourEditText); 
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT); 

Para cerrar, puede utilizar:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
 imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0); 

Pruébelo así en su código:

ed = (EditText)findViewById(R.id.editText1);

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
imm.hideSoftInputFromWindow(ed.getWindowToken(), 0);  

ed.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
        imm.showSoftInput(ed, InputMethodManager.SHOW_IMPLICIT);  
    }
});
usuario1213202
fuente
está funcionando de la misma manera que antes ... ¿Hay algún cambio que deba hacer en el diseño? para esta vista EditText?
Mosca doméstica
bien, ahora funciona después de agregar algunos atributos de diseño ... android: clickable = "true" android: cursorVisible = "false" android: focusable = "false" gracias
Housefly
no, haz una cosa, escribe la ocultación del código del teclado en el método edittext.setOnFocusChangeListener () y prueba
user1213202
esta sería la solución SI pudiera especificar exactamente cuándo usar la llamada hideSoftInput. el teclado aparece automáticamente DESPUÉS de onCreate y onResume
ahmet emrah
2

Bueno, tuve el mismo problema y acabo de abordar con focusable en el archivo XML.

<EditText
            android:cursorVisible="false"
            android:id="@+id/edit"
            android:focusable="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

Probablemente también esté buscando seguridad. Esto también ayudará en eso.

Divyansh
fuente
1

Utilice el siguiente código en su onCreate()método

    editText = (EditText) findViewById(R.id.editText);
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        public void run() {
            InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.hideSoftInputFromWindow(
                    editText.getWindowToken(), 0);
        }
    }, 200);
Priyanka
fuente
1

Lo único que debe hacer es agregar android:focusableInTouchMode="false"a EditText en xml y eso es todo (si alguien aún necesita saber cómo hacerlo de la manera más fácil)

Pez de colores
fuente
1

Para usuarios de Xamarin:

[Activity(MainLauncher = true, 
        ScreenOrientation = ScreenOrientation.Portrait, 
        WindowSoftInputMode = SoftInput.StateHidden)] //SoftInput.StateHidden - disables keyboard autopop
Roy Doron
fuente
1
       <TextView android:layout_width="match_parent"
                 android:layout_height="wrap_content"

                 android:focusable="true"
                 android:focusableInTouchMode="true">

                <requestFocus/>
      </TextView>

      <EditText android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
NickUnuchek
fuente
1

Si está utilizando Xamarin, puede agregar esto

Activity[(WindowSoftInputMode = SoftInput.StateAlwaysHidden)]

a partir de entonces, puede agregar esta línea en el método OnCreate ()

youredittext.ShowSoftInputOnFocus = false;

Si el dispositivo de destino no es compatible con el código anterior, puede utilizar el código siguiente en el evento de clic de EditText

InputMethodManager Imm = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
Imm.HideSoftInputFromWindow(youredittext.WindowToken, HideSoftInputFlags.None);
Ashish Sinha
fuente
1

Encontré que el siguiente patrón me funciona bien en el código donde quiero mostrar un cuadro de diálogo para obtener la entrada (por ejemplo, la cadena que se muestra en el campo de texto es el resultado de las selecciones realizadas a partir de una lista de casillas de verificación en un cuadro de diálogo, en lugar de texto introducido a través del teclado).

  1. Deshabilite el enfoque de entrada suave en el campo de edición. No puedo desactivar para toda la actividad, ya que hay campos de edición para los que quiero que se use el teclado en el mismo diseño.
  2. Los clics iniciales en el campo de texto producen un cambio de enfoque, un clic repetido produce un evento de clic. Así que anulo ambos (aquí no refactorizo ​​el código para ilustrar que ambos controladores hacen lo mismo):

    tx = (TextView) m_activity.findViewById(R.id.allergymeds);
    if (tx != null) {
        tx.setShowSoftInputOnFocus(false);
        tx.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if (hasFocus) {
                    MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                    mld.setPatientId(m_sess.getActivePatientId());
                    mld.show(getFragmentManager(), "Allergy Medications Dialog");
                }
            }
        });
        tx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                mld.setPatientId(m_sess.getActivePatientId());
                mld.show(getFragmentManager(), "Allergy Medications Dialog");
            }
        });
    }
    
lema621
fuente
0

En una aplicación de Android que estaba creando, tenía tres EditTexts LinearLayoutdispuestos horizontalmente. Tuve que evitar que el teclado virtual apareciera cuando se cargaba el fragmento. Además de la configuración focusabley focusableInTouchModede verdad en el LinearLayout, tenía que conjunto descendantFocusabilitya blocksDescendants. En onCreate, llamé requestFocusal LinearLayout. Esto impedía que apareciera el teclado cuando se creaba el fragmento.

Diseño -

    <LinearLayout
       android:id="@+id/text_selector_container"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:weightSum="3"
       android:orientation="horizontal"
       android:focusable="true"
       android:focusableInTouchMode="true"
       android:descendantFocusability="blocksDescendants"
       android:background="@color/black">

       <!-- EditText widgets -->

    </LinearLayout>

En onCreate-mTextSelectorContainer.requestFocus();

indyfromoz
fuente
0

Si alguien todavía está buscando la solución más fácil, establezca el siguiente atributo trueen su diseño principal

android:focusableInTouchMode="true"

Ejemplo:

<android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="true">

.......
......
</android.support.constraint.ConstraintLayout>
Ajmal Salim
fuente
votantes en contra, por favor comenten sus argumentos antes de votar en contra.
Ajmal Salim
0

Use esto para habilitar y deshabilitar EditText ....

InputMethodManager imm;

imm = (InputMethodManager)
getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);

if (isETEnable == true) {

    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    ivWalllet.setImageResource(R.drawable.checkbox_yes);
    etWalletAmount.setEnabled(true);
    etWalletAmount.requestFocus();
    isETEnable = false;
    } 
else {

    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
    ivWalllet.setImageResource(R.drawable.checkbox_unchecked);
    etWalletAmount.setEnabled(false);
    isETEnable = true;
    }
Android Chandigarh Reaston
fuente
0

Prueba esta respuesta

editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);

Nota: solo para API 11+

Ranjith Kumar
fuente
0
private InputMethodManager imm;

...


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

private void hideDefaultKeyboard(View et) {
  getMethodManager().hideSoftInputFromWindow(et.getWindowToken(), 0);
}

private InputMethodManager getMethodManager() {
        if (this.imm == null) {
            this.imm = (InputMethodManager)  getContext().getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
        }
  return this.imm;
}
Denis Raison
fuente
-1

para cualquier vista de texto en su actividad (o cree una vista de texto vacía falsa con android: layout_width = "0dp" android: layout_height = "0dp") y agregue para esta vista de texto siguiente: android: textIsSelectable = "true"

Alex Artemenko
fuente
-1

Simple, simplemente elimine la etiqueta "" del archivo xml

Jeyanth
fuente
2
Por favor, puede ampliar esto y mostrar un ejemplo. Consulte Cómo responder .
Bugs
-1

Solo necesita agregar una propiedad android:focusable="false"en particular EditTexten el diseño xml. Entonces puede escribir lista de clics para EditTextsin la ventana emergente del teclado.

Sree
fuente
-1

El problema se puede ordenar usando, No es necesario establecer editText inputType en ningún valor, solo agregue la línea de abajo, editText.setTextIsSelectable (true);

arun
fuente
¡Oye, gracias por escribir una respuesta! Sin embargo, dado que ya hay tantas respuestas aquí, podría ser aún más útil si realmente escribiera esto como un comentario sobre la respuesta de Ranjith Kumar en lugar de convertirla en su propia respuesta. También podría ser interesante mencionar cuál sería el efecto de omitir el inputType. Pero parece que sería bueno saber si optara por esa otra respuesta, así que incluso si insiste en mantener esto como su propia respuesta, considere dejar un comentario allí de todos modos.
Mark