Como ocultar o teclado virtual quando a atividade começa

151

Eu tenho um Edittext com android:windowSoftInputMode="stateVisible"no manifesto. Agora o teclado será mostrado quando eu iniciar a atividade. Como esconder isso? Não consigo usá-lo android:windowSoftInputMode="stateHiddenporque, quando o teclado estiver visível, minimize o aplicativo e reinicie-o. Eu tentei com

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

mas não funcionou.

Aju
fonte

Respostas:

1

Se você não quiser usar xml, faça uma extensão Kotlin para ocultar o teclado

// In onResume, call this
myView.hideKeyboard()

fun View.hideKeyboard() {
    val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

Alternativas baseadas no caso de uso:

fun Fragment.hideKeyboard() {
    view?.let { activity?.hideKeyboard(it) }
}

fun Activity.hideKeyboard() {
    // Calls Context.hideKeyboard
    hideKeyboard(currentFocus ?: View(this))
}

fun Context.hideKeyboard(view: View) {
    view.hideKeyboard()
}

Como mostrar o teclado virtual

fun Context.showKeyboard() { // Or View.showKeyboard()
    val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.toggleSoftInput(SHOW_FORCED, HIDE_IMPLICIT_ONLY)
}

Método mais simples ao solicitar simultaneamente o foco em um edittext

myEdittext.focus()

fun View.focus() {
    requestFocus()
    showKeyboard()
}

Simplificação de bônus:

Remova os requisitos para sempre usar getSystemService: Biblioteca Splitties

// Simplifies above solution to just
inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
Gibolt
fonte
361

No AndroidManifest.xml:

<activity android:name="com.your.package.ActivityName"
          android:windowSoftInputMode="stateHidden"  />

ou tente

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

Por favor, verifique isso também

Neenu
fonte
3
Obrigado por android:windowSoftInputMode="stateHidden"
Shylendra Madda
2
Na verdade, também há uma ótima resposta para impedir o foco no texto de edição stackoverflow.com/questions/4668210/…
Boris Treukhov
204

Use as seguintes funções para mostrar / ocultar o teclado:

/**
 * Hides the soft keyboard
 */
public void hideSoftKeyboard() {
    if(getCurrentFocus()!=null) {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}

/**
 * Shows the soft keyboard
 */
public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.showSoftInput(view, 0);
}
Sherif elKhatib
fonte
4
Context.INPUT_METHOD_SERVICE para aqueles que estão em fragmentos ou não estão na atividade principal etc.
Oliver Dixon
7
Você pode tentar isso. Funciona se você chamar da atividade. getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) ‌;
Sinan Dizdarević
E se precisarmos chamar isso de dentro de um ouvinte? LikeonFocusChange()
André Yuhai
44

Basta adicionar dois atributos à visualização pai do editText.

android:focusable="true"
android:focusableInTouchMode="true"
mani
fonte
36

Coloque isso no manifesto dentro da tag Activity

  android:windowSoftInputMode="stateHidden"  
Saneesh
fonte
ou android: windowSoftInputMode = "stateUnchanged" - Funciona como: não o mostre se já não estiver sendo exibido, mas se estava aberto ao entrar na atividade, deixe em aberto).
Sujeet Kumar Gupta
você está correto. mas e se a orientação mudasse?
Saneesh
26

Tente o seguinte:

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

Veja este para mais detalhes.

Adnan
fonte
14

Para ocultar o teclado virtual no momento do início de Nova Atividade ou onCreate(), onStart()etc. , você pode usar o código abaixo:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Rana Pratap Singh
fonte
10

Usando AndroidManifest.xml

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

Usando Java

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

usando a solução acima, o teclado esconde, mas evita que o foco ocorra quando a atividade é criada, mas agarre-a quando você os toca usando:

adicione seu EditText

<EditText
android:focusable="false" />

adicione também o ouvinte do seu EditText

youredittext.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
    v.setFocusable(true);
    v.setFocusableInTouchMode(true);
    return false;
}});
Atif Amin
fonte
7

Adicione o seguinte texto ao seu arquivo xml.

<!--Dummy layout that gain focus -->
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:orientation="vertical" >
            </LinearLayout>
Exitos
fonte
6

Espero que isso funcione, tentei vários métodos, mas este funcionou para mim fragments. basta colocar esta linha no onCreateview / init.

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Mubashar
fonte
5

Para ocultar o teclado virtual no momento do início de Nova Atividade ou no método onCreate (), onStart () etc., use o código abaixo:

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

Para ocultar a tecla programável no momento do botão, clique em atividade:

View view = this.getCurrentFocus();

    if (view != null) {
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        assert imm != null;
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
Adão
fonte
5

Use SOFT_INPUT_STATE_ALWAYS_HIDDEN em vez de SOFT_INPUT_STATE_HIDDEN

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Brinda Rathod
fonte
5

adicione sua atividade em manifesta essa propriedade

android:windowSoftInputMode="stateHidden" 
yousef
fonte
4

Coloque esse código no seu arquivo java e passe o argumento para o objeto no edittext,

private void setHideSoftKeyboard(EditText editText){
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
Najib Ahmed Puthawala
fonte
4

Você pode definir a configuração no AndroidManifest.xml

Exemplo:

<activity
    android:name="Activity"
    android:configChanges="orientation|keyboardHidden"
    android:theme="@*android:style/Theme.NoTitleBar"
    android:launchMode="singleTop"
    android:windowSoftInputMode="stateHidden"/>
Long Nguyen
fonte
4

Use o código a seguir para ocultar a tecla programável pela primeira vez ao iniciar a atividade

getActivity().getWindow().setSoftInputMode(WindowManager.
LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Geeta Gupta
fonte
3

Experimente este também

Ed_Cat_Search = (EditText) findViewById(R.id.editText_Searc_Categories);

Ed_Cat_Search.setInputType(InputType.TYPE_NULL);

Ed_Cat_Search.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        Ed_Cat_Search.setInputType(InputType.TYPE_CLASS_TEXT);
        Ed_Cat_Search.onTouchEvent(event); // call native handler
        return true; // consume touch even
    }
});
ritesh4326
fonte
3

As respostas acima também estão corretas. Eu só quero dar um breve resumo de que há duas maneiras de ocultar o teclado ao iniciar a atividade, a partir do manifest.xml. por exemplo:

<activity
..........
android:windowSoftInputMode="stateHidden"
..........
/>
  • A maneira acima sempre a oculta ao entrar na atividade.

ou

<activity
..........
android:windowSoftInputMode="stateUnchanged"
..........
/>
  • Este diz: não mude (por exemplo, não o mostre se ainda não estiver sendo exibido, mas se estava aberto ao entrar na atividade, deixe-o aberto).
Sujeet Kumar Gupta
fonte
2

Isto é o que eu fiz:

yourEditText.setCursorVisible(false); //This code is used when you do not want the cursor to be visible at startup
        yourEditText.setOnTouchListener(new View.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
                    yourEditText.setCursorVisible(true); //This is to display cursor when upon onTouch of Edittext
                }
                return true;
            }
        });
mangu23
fonte
2

Se o seu aplicativo estiver direcionado para o nível 21 da API do Android ou mais, existe um método padrão disponível.

editTextObj.setShowSoftInputOnFocus(false);

Verifique se você definiu o código abaixo na EditTexttag XML.

<EditText  
    ....
    android:enabled="true"
    android:focusable="true" />
Harpreet
fonte
1

Tente isso.

Primeiro no seu xml pesquisável, os campos (nome e dica etc) colocam @stringe não as cadeias literais.

Em seguida onCreateOptionsMenu, método , ele deve ter um ComponentNameobjeto com o nome do seu pacote e o nome completo da sua classe (com o nome do pacote) - Caso a atividade que possui o SearchViewcomponente seja a mesma que a exibição dos resultados da pesquisagetComponentName() , conforme o desenvolvedor do google android.

Tentei muitas soluções e, depois de muito, muito trabalho, essa solução funciona para mim.

toktokwho
fonte
1
Ed_Cat_Search = (EditText) findViewById(R.id.editText_Searc_Categories);

Ed_Cat_Search.setInputType(InputType.TYPE_NULL);

Ed_Cat_Search.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        Ed_Cat_Search.setInputType(InputType.TYPE_CLASS_TEXT);
        Ed_Cat_Search.onTouchEvent(event); // call native handler
        return true; // consume touch even
    }
});

this one worked for me
user3024334
fonte
1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

vai funcionar


fonte
Embora esse código possa responder à pergunta, fornecer um contexto adicional a respeito de por que e / ou como esse código responde à pergunta melhora seu valor a longo prazo.
precisa saber é o seguinte