Excelentes respostas de Luc e Mark, no entanto, está faltando um bom exemplo de código. Adicionar a tag android:focusableInTouchMode="true"
e o android:focusable="true"
layout pai (por exemplo, LinearLayout
ou ConstraintLayout
), como no exemplo a seguir, corrigirá o problema.
<!-- 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"/>
Morgan Christiansson
fonte
android:focusableInTouchMode="true"
!android:focusableInTouchMode="true"
cobreandroid:focusable="true"
+ um pouco mais, portanto, neste caso,android:focusable="true"
é desnecessário e pode ser removido. Além disso, a visualização simulada pode ser uma visualização em vez de um LinearLayout. Isso economiza poder de processamento + evita alguns avisos. Assim, minha recomendação é substituir a exibição fictícia por<View android:focusableInTouchMode="true" android:layout_width="0px" android:layout_height="0px"/>
O problema real é que você simplesmente não quer que ele tenha foco? Ou você não deseja que ele mostre o teclado virtual como resultado do foco no
EditText
? Realmente não vejo um problema com oEditText
foco no início, mas é definitivamente um problema abrir a janela softInput quando o usuário não solicitou explicitamente o focoEditText
(e, como resultado, abriu o teclado).Se for o problema do teclado virtual, consulte a documentação do
AndroidManifest.xml
elemento <atividade> .android:windowSoftInputMode="stateHidden"
- sempre oculte ao entrar na atividade.ou
android:windowSoftInputMode="stateUnchanged"
- 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).fonte
EditText
obtenção de foco. Na verdade, afirma claramente que é assim que você impede que o IME do teclado do software seja aberto automaticamente no foco; porque é mais provável que a maior preocupação seja o teclado virtual aparecer inesperadamente, não o foco em si. Se seu problema éEditText
realmente o foco, use a resposta de outra pessoa.Existe uma solução mais simples. Defina estes atributos no seu layout pai:
E agora, quando a atividade iniciar, esse layout principal terá foco por padrão.
Além disso, podemos remover o foco das visualizações filho em tempo de execução (por exemplo, depois de terminar a edição filho), dando o foco ao layout principal novamente, desta forma:
Bom comentário de Guillaume Perrot :
Realmente, podemos ver que o
beforeDescendants
conjunto é o padrão noViewGroup.initViewGroup()
método (Android 2.2.2). Mas não é igual a 0.ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;
Graças a Guillaume.
fonte
A única solução que encontrei é:
android:focusable="true"
eandroid:focusableInTouchMode="true"
E
EditText
eles não terão o foco depois de iniciar a atividadefonte
O problema parece vir de uma propriedade que eu só posso ver no
XML form
layout.Certifique-se de remover esta linha no final da declaração dentro das
EditText
tags XML:Isso deve dar algo assim:
fonte
usando as informações fornecidas por outros pôsteres, usei a seguinte solução:
no layout XML
em onCreate ()
e, finalmente, em onResume ()
fonte
Tente clearFocus () em vez de
setSelected(false)
. Todas as visualizações no Android têm foco e seleção, e acho que você deseja apenas clarear o foco.fonte
myEditText.clearFocus(); myDummyLinearLayout.requestFocus();
paraonResume
a atividade. Isso garantiu que o EditText não mantivesse o foco quando o telefone fosse girado.O seguinte impedirá o edittext de focar quando criado, mas agarre-o quando você os tocar.
Portanto, você define focusable como false no xml, mas a chave está no java, à qual você adiciona o seguinte ouvinte:
Como você está retornando falso, ou seja, não está consumindo o evento, o comportamento de foco continuará como normal.
fonte
Eu tentei várias respostas individualmente, mas o foco ainda está no EditText. Só consegui resolvê-lo usando duas das soluções abaixo juntas.
(Referência da Silver https://stackoverflow.com/a/8639921/15695 )
e remova
em EditText
(Referência de floydaddict https://stackoverflow.com/a/9681809 )
fonte
Resposta tardia, porém mais simples, basta adicionar isso no layout pai do XML.
Voto a favor se isso ajudou! Happy Coding :)
fonte
Nenhuma dessas soluções funcionou para mim. A maneira como corrigi o foco automático era:
fonte
Solução simples: uso de tags
AndroidManifest
inActivity
fonte
Você pode apenas definir "focalizável" e "focalizável no modo de toque" para o valor verdadeiro no primeiro
TextView
dolayout
. Desta forma, quando a atividade começa aTextView
será focada mas, devido à sua natureza, você vai ver nada focada na tela e, é claro, haverá nenhum teclado exibido ...fonte
O seguinte funcionou para mim
Manifest
. Escreva ,fonte
Eu precisava limpar o foco de todos os campos programaticamente. Acabei de adicionar as duas instruções a seguir à minha definição de layout principal.
É isso aí. Corrigido meu problema instantaneamente. Obrigado, Silver, por me apontar na direção certa.
fonte
Adicione
android:windowSoftInputMode="stateAlwaysHidden"
a tag de atividade doManifest.xml
arquivo.Fonte
fonte
Se você tiver outra visão da sua atividade como a
ListView
, também poderá:no seu
onResume()
para agarrar o foco doeditText
.Eu sei que esta pergunta foi respondida, mas apenas fornecendo uma solução alternativa que funcionou para mim :)
fonte
Tente isso antes do seu primeiro campo editável:
fonte
Adicione o seguinte no
onCreate
método:fonte
Como não gosto de poluir o XML com algo relacionado à funcionalidade, criei esse método que "transparentemente" rouba o foco da primeira exibição focalizável e depois se remove quando necessário!
fonte
Tarde, mas talvez útil. Criar um EditText manequim no topo do seu layout em seguida, chamar
myDummyEditText.requestFocus()
nosonCreate()
Isso parece se comportar como eu esperava. Não há necessidade de lidar com alterações na configuração, etc. Eu precisava disso para uma Atividade com um TextView longo (instruções).
fonte
Escreva esta linha no seu Layout pai ...
fonte
Sim, eu fiz a mesma coisa - crie um layout linear 'fictício' que obtenha o foco inicial. Além disso, defino os 'próximos' IDs de foco para que o usuário não possa mais focá-lo depois de rolar uma vez:
muito trabalho apenas para se livrar do foco em uma exibição ..
obrigado
fonte
Para mim, o que funcionou em todos os dispositivos é o seguinte:
Basta colocar isso como uma visão antes da visão focada problemática, e é isso.
fonte
A coisa mais simples que fiz foi focar em outra visualização no onCreate:
Isso interrompeu o teclado virtual e não havia cursor piscando no EditText.
fonte
Esta é a solução perfeita e mais fácil. Sempre uso isso no meu aplicativo.
fonte
fonte
Escreva esse código dentro do
Manifest
arquivo emActivity
que você não deseja abrir o teclado.Arquivo de manifesto:
fonte
Na
onCreate
sua Atividade, basta adicionar usoclearFocus()
ao seu elemento EditText. Por exemplo,E se você quiser desviar o foco para outro elemento, use
requestFocus()
isso. Por exemplo,fonte
Eu uso o código a seguir para impedir que um EditText roube o foco quando meu botão é pressionado.
Basicamente, oculte o texto de edição e mostre-o novamente. Isso funciona para mim, pois o EditText não é em exibição, portanto, não importa se está sendo exibido.
Você pode tentar ocultar e mostrá-lo em sucessão para ver se isso ajuda a perder o foco.
fonte