Teclado pop-up automático ao iniciar a atividade


97

Eu tenho uma pergunta relativamente simples. Eu tenho uma atividade com muitos EditText's neles. Quando eu abro a atividade, ela automaticamente focaliza o primeiro EditText e exibe o teclado virtual.

Como posso evitar isso?


Verifique minha resposta para esta pergunta stackoverflow.com/questions/39593324/…
Android Help

Quando meu aplicativo é inicializado (aberto) e se a visualização de edição de texto está disponível, o teclado é habilitado automaticamente (mostrar). Clique aqui para resolver este problema easycomacademy.com/…
AhmadUllah Ahmad

Respostas:


209

Use estes atributos em sua tag de layout no arquivo XML:

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

Conforme relatado por outros membros em comentários, ele não funciona, ScrollViewportanto, você precisa adicionar esses atributos ao filho principal de ScrollView.


3
Isso também corrigiu meu problema. Eu adicionei isso à tag RelativeLayout para minha atividade. Obrigado!
Lucas,

21
Curiosamente, não funcionou quando adicionei o acima a um ScrollView, mas funcionou para um LinearLayout
Jerry Brady,

1
Eu acho que você tem que colocá-lo no layout superior
Utsav Gupta

Então eu acho que isso funciona porque você está dizendo ao próprio layout que ele pode ter foco? Caso contrário, ele assume que precisa dar foco ao primeiro controle no formulário? Curiosamente, eu estava usando o teclado mesmo se todos os controles do meu formulário estivessem desabilitados. Corrigido agora. Obrigado!
crowmagnumb

1
É importante observar que essa solução cria problemas de acessibilidade (uma exibição que não deve ser focalizada sendo marcada como tendo foco) e pode ter consequências indesejadas.
Renato

96

Você pode adicionar isso à sua atividade de Manifesto do Android:

android:windowSoftInputMode="stateHidden|adjustResize"

Isso funciona, no entanto, se você tiver um fundo de imagem e estiver preocupado com o fato de seu teclado android:windowSoftInputMode="stateHidden|adjustPan"
virtual

31

Tenho várias implementações descritas aqui, mas agora adicionei à propriedade AndroidManifest.xmlfor my Activity:

android:windowSoftInputMode="stateAlwaysHidden"

Acho que essa é a maneira mais fácil, mesmo se você estiver usando fragments.

" stateAlwaysHidden " O teclado virtual está sempre oculto quando a janela principal da atividade tem o foco de entrada.


isso funcionou para mim com um ScrollView e um RelativeLayout.
iversoncru

Não é tão bom para fragmentos, pois você está associando o "estado oculto" à atividade que conterá todos os seus fragmentos, o que significa que qualquer fragmento que você deseja exibir na atividade será afetado pela propriedade (não em um "por fragmento "base).
Pelpotronic

11

Se você tiver outra visão de sua atividade, como um ListView, também pode fazer:

ListView.requestFocus(); 

em seu onResume () para obter o foco do editText.

Eu sei que esta pergunta foi respondida, mas apenas fornecendo uma solução alternativa que funcionou para mim :)


5

https://stackoverflow.com/a/11627976/5217837 Isso está quase correto:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Mas deve ser SOFT_INPUT_STATE_HIDDEN em vez de SOFT_INPUT_STATE_ALWAYS_VISIBLE


4

Use isso no código da sua atividade:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Isso não funcionou para mim - o teclado ainda apareceu quando eu iniciei minha atividade.
David Doria

Você pode verificar este link, vai funcionar: stackoverflow.com/questions/18977187/…
Sujeet Kumar Gupta

3

Tive um problema semelhante, mesmo ao alternar entre as guias, o teclado apareceu automaticamente e permaneceu ativo, com o Android 3.2.1 em um Tablet. Use o seguinte método:

public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);
    if (isFocused) {
        searchEditText.requestFocus();
    } else {
        InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
    }
}   

No onCreate () e no onPause () da atividade para cada EditText:

setEditTextFocus (myEditText, false);

Para cada EditText um OnTouchListener:

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

Para cada um EditTextem OnEditorActionListener:

    myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                            .......
            setEditTextFocus(myEditText, false); 
            return false;
        }
    });

E para cada um EditTextno layout xml:

            android:imeOptions="actionDone"
            android:inputType="numberDecimal|numberSigned" // Or something else

Provavelmente, há mais otimização de código possível.


3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

usando fragmento ..este código funciona para ocultar o teclado ... quando um fragmento abrir, evite o foco no teclado do campo de texto de edição ...
Sreelal S

2

Eu encontrei esta solução simples que funcionou para mim. Defina estes atributos em seu layout pai:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >

E agora, quando a atividade começar, esse layout principal receberá o foco por padrão.

Além disso, podemos remover o foco das visualizações filhas em tempo de execução, dando o foco ao layout principal novamente, como este:

findViewById(R.id.mainLayout).requestFocus();

Espero que funcione para você.


1

esta é a solução que estou usando, não é a melhor solução, mas está funcionando bem para mim

 editComment.setFocusableInTouchMode(false);
 editComment.setOnTouchListener(new OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent event)
                {
                    // TODO Auto-generated method stub
                    editComment.setFocusableInTouchMode(true);
                     editComment.requestFocus() ;
                    return false;
                }});

1

Curiosamente, esta documentação https://developer.android.com/training/keyboard-input/visibility.html declara que quando uma atividade começa e o foco é dado a um campo de texto, o teclado virtual não é mostrado (e então passa para mostrar como fazer com que o teclado seja mostrado se você quiser com algum código).

No meu Samsung Galaxy S5, é assim que meu aplicativo (sem entrada de manifesto ou código específico) funciona - sem teclado virtual. No entanto, em um Lollipop AVD, um teclado virtual é mostrado - contrariando o documento fornecido acima.

Se você obtiver esse comportamento ao testar em um AVD, convém testar em um dispositivo real para ver o que acontece.


1

Isso tem algumas boas respostas no seguinte post: Impeça que EditText ganhe foco na inicialização da atividade . O que eu uso regularmente é o seguinte código de Morgan :

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext"     
    android:nextFocusLeft="@id/autotext"/>

NOTA : O item fictício deve ser COLOCADO À DIREITA ANTES do elemento focalizável.

E eu acho que deve funcionar perfeitamente mesmo com ScrollView e não teve nenhum problema de acessibilidade para isso.


0

Isso ocorre quando seu EditText obtém o Foco automaticamente, assim como quando sua atividade começa. Portanto, uma maneira fácil e estável de corrigir isso é simplesmente definir o foco inicial para qualquer outra visualização, como um botão, etc.

Você pode fazer isso em seu layout XML, sem necessidade de código.


0

Resposta aceita não está funcionando para mim, é por isso que dar solução de trabalho de resposta, pode ser útil!

EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();    
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Agora o teclado está aberto, aproveite :)


A questão era como evitar que o teclado se abrisse.
jk7,

0

android: windowSoftInputMode = "stateHidden | AdjustResize"

Trabalhando bem


0

Adicione o código abaixo ao topo do XML da atividade e certifique-se de que a visualização esteja acima do EditText

<View 
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>

0

android:focusableInTouchMode="true"

Adicione a linha acima ao xml de EditTextou TextInputLayoutque tenha o foco e esteja causando osoftInputKeyboard apareça.

Isso resolveu o problema para nós e agora o teclado não aparece


0

search_edit_text = (EditText) findViewById (R.id.search_edit_text);

    search_edit_text.requestFocus();
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Isso funciona para mim, o fragmento de caras pode ter alguma sintaxe diferente. ISSO FUNCIONA PARA ATIVIDADE


Você precisa fornecer quaisquer limitações, suposições ou simplificações em sua resposta. Veja mais detalhes sobre como responder neste link: stackoverflow.com/help/how-to-answer
Usama Abdulrehman

-1

Se a sua visualização tiver Editar Texto e Listar, o Teclado será aberto por padrão. Para impedir que o teclado apareça por padrão, faça o seguinte

this.listView.requestFocus();

Certifique-se de que está solicitando foco em listview depois de obter view para editText.

Por exemplo

this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();

Se você fizer isso, o editText terá o foco e o teclado aparecerá.


Eu fiz isso, mas o teclado ainda aparece e o foco está no editText.
David Doria
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.