Impedir que o teclado seja exibido no início da atividade

265

Eu tenho uma atividade com uma Edit Textentrada. Quando a atividade é inicializada, o teclado do Android é mostrado. Como o teclado pode permanecer oculto até que o usuário foque a entrada?

Fcoder
fonte
93
no seu manifesto<activity android:windowSoftInputMode="stateHidden" ...>
idiottiger 16/03/12
1
possível duplicata do Android na tela auto teclado aparecendo
Caleb
1
Como usar junto android:windowSoftInputMode="adjustPan"?
János
4
@ János android: windowSoftInputMode = "AdjustPan | stateHidden"
Alexey Strakh 9/17
a resposta neste comentário, foi a resposta que eu estou procurando: stackoverflow.com/a/23605510/6942602
korchix

Respostas:

436

Eu acho que o seguinte pode funcionar

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

Eu já usei para esse tipo de coisa antes.

Lucas
fonte
Existe uma maneira de configurá-lo para ser um teclado apenas de dígitos? ou seja, teclado 12Key?
Mohamed Khamis
@MohamedKhamis input.setRawInputType (Configuration.KEYBOARD_12KEY);
precisa saber é o seguinte
1
Sim, ainda funciona. @SagarNayak, por que você deseja ocultar o teclado EditText? :) Isso é para ocultar o teclado quando a atividade começar, que contém #EditText
Martynas 14/16
@Devealte 7 anos depois e funcionou para mim, você o colocou no onCreate?
Dymas 13/03/19
@Dymas Sim, e eu o
corrigi
180

Experimente também -

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Caso contrário, declare na atividade do arquivo de manifesto -

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
          android:label="@string/app_name"
          android:windowSoftInputMode="stateHidden"
          >

Se você já estiver usando android:windowSoftInputModeum valor como adjustResizeou adjustPan, poderá combinar dois valores como:

<activity
        ...
        android:windowSoftInputMode="stateHidden|adjustPan"
        ...
        >

Isso ocultará o teclado sempre que apropriado, mas moverá a exibição da atividade caso o teclado precise ser mostrado.

Praveenkumar
fonte
3
obrigado por mostrar tanto no código quanto no xml! De fato, esta é a resposta mais correta! Especialmente desde que foi provavelmente que 3 minutos você gastou escrevendo ambos os métodos que fizeram você não primeiro ;-)
eric
34

Esconda-o para todas as atividades usando o tema

<style name="MyTheme" parent="Theme">
    <item name="android:windowSoftInputMode">stateHidden</item>
</style>

definir o tema

<application android:theme="@style/MyTheme">
dira
fonte
como esta abordagem global.
precisa saber é o seguinte
1
Isso funcionou como eu estava usando temas diferentes em vários lugares
nmxprime
22

Adicione essas duas propriedades ao layout pai (ex: Layout linear, Layout relativo)

android:focusable="false"
android:focusableInTouchMode="false" 

Ele fará o truque :)

Rei das Massas
fonte
2
Isso não funciona para mim, no entanto, configurá-los para truefuncionar, conforme a resposta de Jack T. Houve uma mudança de comportamento nas versões recentes?
Metamorfose
Além da minha resposta, você precisa verificar as outras propriedades que você tem no manifesto e para editar o texto.
Rei das Massas
Eu só tenho as propriedades mais básicas neles. Eu não entendo por que configurá-las para falsefuncionar, pois a idéia é desviar o foco das caixas EditText.
Metamorfose
Talvez ele costumava desviar o foco das caixas EditText, afastando-o do layout pai? Mas não mais, ao que parece.
Metamorfose
13

Tente declará-lo no arquivo manifesto

<activity android:name=".HomeActivity"
      android:label="@string/app_name"
      android:windowSoftInputMode="stateAlwaysHidden"
      >
androidify
fonte
11

Se você estiver usando o nível 21 da API, poderá usar editText.setShowSoftInputOnFocus (false);

SaraVF
fonte
9

Basta adicionar no AndroidManifest.xml

<activity android:name=".HomeActivity"  android:windowSoftInputMode="stateHidden">
</activity>
Dayanand Waghmare
fonte
8

Basta adicionar isso no seu arquivo manifest.xml

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

Você está pronto.

Androido
fonte
7

Você também pode escrever essas linhas de código no layout pai direto do arquivo de layout .xml no qual você tem o "problema":

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

Por exemplo:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    ...
    android:focusable="true"
    android:focusableInTouchMode="true" >

    <EditText
        android:id="@+id/myEditText"
        ...
        android:hint="@string/write_here" />

    <Button
        android:id="@+id/button_ok"
        ...
        android:text="@string/ok" />
</LinearLayout>


EDIT:

Exemplo se o EditText estiver contido em outro layout:

<?xml version="1.0" encoding="utf-8"?>
<ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    ... >                                            <!--not here-->

    ...    <!--other elements-->

    <LinearLayout
        android:id="@+id/theDirectParent"
        ...
        android:focusable="true"
        android:focusableInTouchMode="true" >        <!--here-->

        <EditText
            android:id="@+id/myEditText"
            ...
            android:hint="@string/write_here" />

        <Button
            android:id="@+id/button_ok"
            ...
            android:text="@string/ok" />
    </LinearLayout>

</ConstraintLayout>

A chave é garantir que o EditText não seja diretamente focável.
Tchau! ;-)

Jack T
fonte
6

Melhor solução para mim, cole sua turma

@Override
public void onResume() {
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onResume();
}

@Override
public void onStart() {
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onStart();
}
Efe ÖZYER
fonte
3

Função para ocultar o teclado.

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();

    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

Oculte o teclado no arquivo AndroidManifext.xml.

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:windowSoftInputMode="stateHidden">
Philip BH
fonte
3

Para expandir a resposta aceita por @Lucas:

Chame isso de sua atividade em um dos eventos do ciclo inicial:

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

Exemplo de Kotlin:

override fun onResume() {
  super.onResume()

  window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
}
Trevor.Screws
fonte
2

Você pode tentar este atributo exclusivo definido para cada elemento

TextView mtextView = findViewById(R.id.myTextView);
mtextView.setShowSoftInputOnFocus(false);

O teclado não será exibido enquanto o elemento estiver em foco

Somwang Souksavatd
fonte
Embora isso possa responder à pergunta dos autores, faltam algumas palavras explicativas e / ou links para a documentação. Os trechos de código bruto não são muito úteis sem algumas frases ao seu redor. Você também pode descobrir como escrever uma boa resposta muito útil. Por favor, edite sua resposta - Da avaliação
Nick
1
//to hide the soft keyboard
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
Yuliia Ashomok
fonte
0

basta adicionar isso em sua atividade:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
      if (getCurrentFocus() != null) {
           InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
           imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
      }
      return super.dispatchTouchEvent(ev);
}
haythem souissi
fonte