Meu layout contém ListView
, SurfaceView
e EditText
. Quando clico em EditText
, ele recebe o foco e o teclado na tela é exibido. Quando clico em algum lugar fora do EditText
, ele ainda tem o foco (não deveria). Acho que poderia configurar o OnTouchListener
's nas outras visualizações no layout e limpar o EditText
foco manualmente . Mas parece muito hackeado ...
Eu também tenho a mesma situação no outro layout - exibição de lista com diferentes tipos de itens, alguns dos quais têm EditText
dentro. Eles agem exatamente como escrevi acima.
A tarefa é fazer com que EditText
perca o foco quando o usuário tocar algo fora dele.
Já vi perguntas semelhantes aqui, mas não encontrei nenhuma solução ...
fonte
hideSoftInputFromWindow()
foco claroCom base na resposta de Ken, aqui está a solução de copiar e colar mais modular.
Nenhum XML necessário.
Coloque-o em sua atividade e ele se aplicará a todos os EditTexts, incluindo aqueles dentro dos fragmentos dessa atividade.
fonte
MotionEvent.ACTION_DOWN
paraMotionEvent.ACTION_UP
no seu código. Ótima resposta btw!Para a visualização pai do EditText, deixe os 3 atributos a seguir serem " verdadeiros ":
clickable , focusable , focusableInTouchMode .
Se uma visão deseja receber o foco, ela deve satisfazer estas 3 condições.
Veja android.view :
Espero que ajude.
fonte
(clickable) *OR* (focusable *AND* focusableInTouchMode)
;)Basta colocar essas propriedades na parte superior do pai.
fonte
A resposta de Ken funciona, mas é engenhosa. Como pcans alude no comentário da resposta, o mesmo poderia ser feito com dispatchTouchEvent. Essa solução é mais limpa, pois evita a necessidade de hackear o XML com um FrameLayout transparente e fictício. Aqui está o que parece:
fonte
Para mim abaixo as coisas funcionaram -
1. Adicionando
android:clickable="true"
eandroid:focusableInTouchMode="true"
aoparentLayout
deEditText
ieandroid.support.design.widget.TextInputLayout
2. Substituindo
dispatchTouchEvent
na classe Activity e inserindohideKeyboard()
função3. Adicionando
setOnFocusChangeListener
para EditTextfonte
Você provavelmente já encontrou a resposta para este problema, mas estou procurando uma maneira de resolver isso e ainda não consigo encontrar exatamente o que estava procurando, então resolvi postar aqui.
O que fiz foi o seguinte (isso é muito generalizado, o objetivo é dar uma ideia de como proceder, copiar e colar todo o código não vai funcionar O: D):
Primeiro, tenha o EditText e quaisquer outras visualizações que você deseja em seu programa envolvidas por uma única visualização. No meu caso, usei um LinearLayout para embrulhar tudo.
Então, em seu código, você deve definir um Touch Listener para seu LinearLayout principal.
Espero que isso ajude algumas pessoas. Ou pelo menos os ajuda a começar a resolver seus problemas.
fonte
Basta definir duas propriedades do pai dessa
EditText
como:Portanto, quando o usuário tocar fora da
EditText
área, o foco será removido porque o foco será transferido para a visualização principal.fonte
Eu tenho uma lista
ListView
deEditText
pontos de vista. O cenário diz que após editar o texto em uma ou mais linha (s), devemos clicar em um botão chamado "terminar". UseionFocusChanged
naEditText
view dentro dolistView
mas após clicar em finalizar os dados não estão sendo salvos. O problema foi resolvido adicionandodentro de
onClickListener
para o botão "terminar" e os dados foram salvos com sucesso.fonte
Eu realmente acho que é uma maneira mais robusta de usar do
getLocationOnScreen
quegetGlobalVisibleRect
. Porque encontro um problema. Existe um Listview que contém algum Edittext ee definidoajustpan
na atividade. AchogetGlobalVisibleRect
return um valor que parece incluir o scrollY nele, mas o event.getRawY está sempre perto da tela. O código abaixo funciona bem.fonte
Para perder o foco quando outra visualização é tocada, ambas as visualizações devem ser definidas como view.focusableInTouchMode (true).
Mas parece que o uso de focos no modo de toque não é recomendado. Dê uma olhada aqui: http://android-developers.blogspot.com/2008/12/touch-mode.html
fonte
A melhor maneira é usar o método padrão
clearFocus()
Você sabe como resolver códigos em
onTouchListener
certo?Basta ligar
EditText.clearFocus()
. Isso limpará o foco emlast EditText
.fonte
Como @pcans sugeriu, você pode fazer isso substituindo
dispatchTouchEvent(MotionEvent event)
em sua atividade.Aqui, obtemos as coordenadas de toque e as comparamos com os limites de visualização. Se o toque for executado fora de uma visão, faça algo.
Também não é necessário verificar a existência de visualização e visibilidade se o layout de sua atividade não mudar durante o tempo de execução (por exemplo, você não adiciona fragmentos ou substitui / remove visualizações do layout). Mas se você quiser fechar (ou fazer algo semelhante) o menu de contexto personalizado (como na Google Play Store ao usar o menu flutuante do item) é necessário verificar a existência de visualização. Caso contrário, você receberá um
NullPointerException
.fonte
Este simples trecho de código faz o que você deseja
fonte
Em Kotlin
hidekeyboard () é uma extensão Kotlin
Em atividade, adicione dispatchTouchEvent
Adicione essas propriedades no primeiro item principal
fonte
Esta é minha versão baseada no código zMan. Não ocultará o teclado se a próxima visualização também for um texto de edição. Ele também não ocultará o teclado se o usuário apenas rolar a tela.
fonte