Como parar o EditText de ganhar foco na inicialização da atividade no Android
Eu tenho um Activityno Android, com dois elementos:
Quando Activityinicio, o EditTextfoco de entrada é imediatamente (cursor piscando). Não quero que nenhum controle tenha foco de entrada na inicialização. Eu tentei:
Sem sorte Como convencer a EditTextnão selecionar a si mesma quando Activityiniciar?
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, LinearLayoutou ConstraintLayout), como no exemplo a seguir, corrigirá o problema.
— Morgan Christiansson
Que tal definir o layout pai para android:focusableInTouchMode="true"!
— Muhammad Babar 21/03
Perfeito! Obrigado ... Uma coisa a se notar é que o item fictício deve ser COLOCADO CERTO ANTES do elemento focalizável !!! Eu tinha um TextView entre o meu manequim e o EditText e o método não funcionou!
— maddob
ajuste Android: focusableInTouchMode = "true" para o layout pai foi a abordagem boa graças @Muhammad Babar
Ótimo código, me ajudou muito :) Para tentar melhorar, android:focusableInTouchMode="true"cobre android: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 @PietroRea Android possui comportamentos irritantes de foco automático, incorporados ao comportamento principal de sua estrutura de aplicativos. Se você disser que um texto de edição está liberando ou perdendo o foco, ele decide automaticamente para onde o foco vai. Sem um novo objeto para o qual o foco será transferido, ele seleciona o primeiro elemento que pode ser focalizado no layout, mesmo quando esse é o elemento que acabou de limpar o foco! É meio louco e frustrante, mas talvez haja uma razão válida para esse tipo de comportamento.
— Wedding Weston
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 o EditTextfoco no início, mas é definitivamente um problema abrir a janela softInput quando o usuário não solicitou explicitamente o foco EditText(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).
ainda assim, o cursor está no primeiro EditText no layout - mesmo que o teclado não seja mostrado
— martyglaubitz
@ Anderson: Nada na resposta implicava que isso impediria a EditTextobtençã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 é EditTextrealmente o foco, use a resposta de outra pessoa.
configurá-lo de forma programática: stackoverflow.com/questions/6138330/...
— Nick Franceschina
Não fazer isso em uma atividade com uma câmera - ele quebra o momento do flash (não me pergunte o porquê)
@ Joe esta questão não é sobre como ocultar o teclado na inicialização. Essa pergunta foi feita aqui stackoverflow.com/questions/18977187/…
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 :
android:descendantFocusability="beforeDescendants"parece ser o padrão (o valor inteiro é 0). Funciona apenas adicionando android:focusableInTouchMode="true".
Realmente, podemos ver que o beforeDescendantsconjunto é o padrão no ViewGroup.initViewGroup()método (Android 2.2.2). Mas não é igual a 0.ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;
Graças a Guillaume.
É importante definir esses atributos para o pai direto da exibição, que ganha foco na criação de atividades, caso contrário, não funcionará.
— 9135 tomrozb
Apenas uma solução perfeita. Funciona para: 1. Desabilitar o foco automático e 2. Desabilitar a abertura automática do teclado virtual
— Conheça o
Agradável. Não precisa ser um pai direto. Eu defini-lo no nível raiz do layout e parece funcionar bem.
@DanielWilson quando você deseja uma visualização de rolagem como pai direto de um edittext?
Você precisa trabalhar com a entrada suave da janela, como readyandroid.wordpress.com/…
— Android pronto
A única solução que encontrei é:
Crie um LinearLayout (não sei se outros tipos de layout funcionarão)
Defina os atributos android:focusable="true"eandroid:focusableInTouchMode="true"
E EditTexteles não terão o foco depois de iniciar a atividade
Simples!! Inicialmente, adicionei essas propriedades à exibição pai, que falharam, depois as configurei para outro layout e funcionou bem. Obrigado!!
Também funciona com um ConstraintLayout.
— Hawklike 26/08/19
O problema parece vir de uma propriedade que eu só posso ver no XML formlayout.
Certifique-se de remover esta linha no final da declaração dentro das EditTexttags XML:
Isso deve dar algo assim:
— floydaddict
usando as informações fornecidas por outros pôsteres, usei a seguinte solução:
no layout XML
em onCreate ()
e, finalmente, em onResume ()
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.
Isso parece promissor, mas em que ponto do ciclo de vida da atividade deve ser chamado? Se eu chamar onCreate (), o EditText ainda terá foco. Deve ser chamado onResume () ou algum outro local? Obrigado!
Combinei a resposta aceita com esta resposta. Liguei myEditText.clearFocus(); myDummyLinearLayout.requestFocus();para onResumea atividade. Isso garantiu que o EditText não mantivesse o foco quando o telefone fosse girado.
— teedyay
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.
— MinceMan
Mas isso nunca vai ganhar foco no futuro, como parar o foco apenas no início (início da atividade)?
O onTouchListener é chamado antes de outras ações de toque. Portanto, ao ativar o foco no toque, o foco padrão acontece no primeiro toque. O teclado aparecerá e tudo.
Eu acho que essa é a melhor maneira de fazer isso. Além disso, o código fictício mágico xml mumbo-jumbo acima NÃO funcionou para um conjunto complexo de textos de edição ... Se isso funcionar, votarei definitivamente.
Mas se você estiver tendo vários textos de edição, ele focará na próxima edição de texto e abrirá o teclado, por isso é melhor adicionar o android: windowSoftInputMode = "stateAlwaysHidden" no manifesto para uma atividade específica.
— 31418 Karan sharma
Nota: no Android P, o sistema não terá mais o foco padrão. Isso significa que esse hack não é necessário, começando com P. #
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 )
em EditText
(Referência de floydaddict https://stackoverflow.com/a/9681809 )
— Lee Yi Hong
Eu tive que adicionar o edittext.clearFocus () além dos itens acima para fazê-lo funcionar :) #
— 9104 Nav Nav
Resposta tardia, porém mais simples, basta adicionar isso no layout pai do XML.
Voto a favor se isso ajudou! Happy Coding :)
— Rishabh Saxena
funcionou perfeitamente para mim. mais uma coisa a observar é, não adicione essas linhas para rolar a exibição. Não funcionará na exibição de rolagem. Mas funcionou perfeitamente com layout linear.
— Karthic Srinivasan
Nenhuma dessas soluções funcionou para mim. A maneira como corrigi o foco automático era:
— rallat
android: windowSoftInputMode = "adjustPan" em qualquer atividade no manifesto Android
Solução simples: uso de tags AndroidManifestinActivity
— Sergey Sheleg
A rigor, isso não resolve o problema. o OP disse: "Não quero que nenhum controle tenha foco de entrada na inicialização". Sua solução apenas oculta o teclado, há uma diferença sublime.
— katzenhut 4/09/14
@ katzenhut sim, esse é o meu problema com esta resposta exatamente. Concentrando-se na minha EditText abre uma atividade PlaceAutoComplete, assim que esta resposta é incompleta
Esta resposta seria completa se a pergunta fosse: Como garantir sempre que minha atividade nunca mostre um teclado. O que não é.
Você pode apenas definir "focalizável" e "focalizável no modo de toque" para o valor verdadeiro no primeiro TextViewdo layout. Desta forma, quando a atividade começa a TextViewserá focada mas, devido à sua natureza, você vai ver nada focada na tela e, é claro, haverá nenhum teclado exibido ...
funciona perfeitamente para mim, eu apenas definir o valor no layout outmost em minha atividade e não ao primeiro textview
— Maverick1st
O seguinte funcionou para mim Manifest. Escreva ,
— Babar Sanah
Isso não desfoca o campo de texto: apenas oculta o teclado. Você ainda receberá uma dica que é enviada para fora do campo, e qualquer seletor de estado de cor exibirá o estado "focus = true".
— A. Rager
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.
— jakeneff
Adicione android:windowSoftInputMode="stateAlwaysHidden"a tag de atividade do Manifest.xmlarquivo.
— prgmrDev
Se você tiver outra visão da sua atividade como a ListView, também poderá:
no seu onResume()para agarrar o foco do editText.
Eu sei que esta pergunta foi respondida, mas apenas fornecendo uma solução alternativa que funcionou para mim :)
Tente isso antes do seu primeiro campo editável:
Adicione o seguinte no onCreatemétodo:
— Vishal Raj
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!
— Takhion
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).
Por que não fazer isso apenas com a visualização raiz?
Escreva esta linha no seu Layout pai ...
— Vishal Vaishnav
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 ..
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.
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.
Esta é a solução perfeita e mais fácil. Sempre uso isso no meu aplicativo.
Escreva esse código dentro do Manifestarquivo em Activityque você não deseja abrir o teclado.
Arquivo de manifesto:
— Tarit Ray
Na onCreatesua Atividade, basta adicionar uso clearFocus()ao seu elemento EditText. Por exemplo,
E se você quiser desviar o foco para outro elemento, use requestFocus()isso. Por exemplo,
— Compaq LE2202x
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.