Eu gastei cerca de 6 horas nisso até agora e atingi nada além de obstáculos. A premissa geral é que há alguma linha em ListView
(seja gerada pelo adaptador ou adicionada como uma visualização de cabeçalho) que contém um EditText
widget e a Button
. Tudo o que eu quero fazer é poder usar o jogball / setas, para navegar no seletor para itens individuais como o normal, mas quando chego a uma linha específica - mesmo que eu precise identificar explicitamente a linha - que tem foco criança, quero que essa criança se concentre em vez de indicar a posição com o seletor.
Eu tentei muitas possibilidades e até agora não tive sorte.
layout:
<ListView
android:id="@android:id/list"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
/>
Visualização do cabeçalho:
EditText view = new EditText(this);
listView.addHeaderView(view, null, true);
Supondo que haja outros itens no adaptador, o uso das teclas de seta move a seleção para cima / baixo na lista, conforme o esperado; mas, ao chegar à linha do cabeçalho, ela também é exibida com o seletor e não há como focar noEditText
uso do jogball. Nota: tocando no EditText
vai centrar-se nesse ponto, no entanto, que se baseia em uma tela sensível ao toque, o que não deve ser um requisito.
ListView
aparentemente possui dois modos nesse sentido:
1 setItemsCanFocus(true)
.: o seletor nunca é exibido, mas oEditText
foco pode ser obtido ao usar as setas. O algoritmo de busca por foco é difícil de prever e nenhum feedback visual (em qualquer linha: ter filhos focáveis ou não) sobre o item selecionado, os quais podem proporcionar ao usuário uma experiência inesperada.
2 setItemsCanFocus(false)
.: o seletor é sempre desenhado no modo não sensível ao toque e EditText
nunca consegue obter foco - mesmo se você tocar nele.
Para piorar a situação, a chamada editTextView.requestFocus()
retorna verdadeira, mas na verdade não dá o foco EditText.
O que estou imaginando é basicamente um híbrido de 1 e 2, onde, em vez da configuração da lista, se todos os itens forem focáveis ou não, eu quero definir a focagem para um único item da lista, para que o seletor faça a transição sem problemas da seleção de linha inteira para itens não focáveis e percorrer a árvore de foco para itens que contêm filhos focáveis.
Algum comprador?
descendantFocusability="afterDescendants"
permitirá que o seu EditText tenha foco dentro do ListView, mas você não terá um seletor de itens da lista enquanto estiver navegando com um dpad. Minha tarefa era ter o seletor de itens da lista em todas as linhas, exceto aquela com o EditText. Ainda bem que ajudou. FWIW, acabamos reavaliando essa implementação e decidimos que um foco dentro de um ListView não é apenas um design de interface do usuário idiomático para Android, então descartamos a ideia em favor de uma abordagem mais amigável para o Android.Isso me ajudou.
No seu manifesto:
fonte
OnItemSelectedListener
não muda isso. No entanto, a solução simples de Iogan funciona como um encanto, obrigado!android:descendantFocusability
propriedade de Joe colocou meusEditText
s dentro de umaListView
resolução adequada do teclado, com os votos positivos de ambos.android:descendantFocusability
por si só, não funcionou e eu não estava remotamente entusiasmado@Overriding
onItemSelected
por todos os 14EditText
s com os quais tenho que lidar. :) Obrigado!Minha tarefa era implementar o
ListView
que se expande quando clicado. O espaço adicional mostraEditText
onde você pode inserir algum texto. O aplicativo deve funcionar em 2.2+ (até 4.2.2 no momento em que este foi escrito)Tentei várias soluções neste post e em outras que encontrei; testou-os em dispositivos 2.2 até 4.2.2. Nenhuma das soluções foi satisfatória em todos os dispositivos 2.2+, cada solução apresentou problemas diferentes.
Eu queria compartilhar minha solução final:
android:descendantFocusability="afterDescendants"
setItemsCanFocus(true);
android:windowSoftInputMode="adjustResize"
Muitas pessoas sugerem,adjustPan
masadjustResize
oferece ux imho muito melhor, apenas teste isso no seu caso. ComadjustPan
você, os itens de lista inferiores serão obscurecidos, por exemplo. Os documentos sugerem que ("Isso geralmente é menos desejável do que redimensionar"). Também na 4.0.4, após o usuário começar a digitar no teclado virtual, a tela se move para o topo.adjustResize
existem alguns problemas com o foco do EditText. A solução é aplicar a solução rjrjr a partir deste encadeamento. Parece assustador, mas não é. E isso funciona. Apenas tente.Adicional 5. Devido à atualização do adaptador (devido ao redimensionamento da exibição) quando o
EditText
foco se concentra nas versões anteriores do HoneyComb, encontrei um problema com as exibições invertidas: obtendo o item View for ListView / ordem inversa no 2.2; trabalha em 4.0.3Se você estiver fazendo algumas animações, poderá alterar o comportamento
adjustPan
das versões anteriores ao favo de mel para que o redimensionamento não seja acionado e o adaptador não atualize as visualizações. Você só precisa adicionar algo assimTudo isso fornece ux aceitável em dispositivos 2.2 - 4.2.2. Espero que isso poupe tempo às pessoas, pois levei pelo menos várias horas para chegar a essa conclusão.
fonte
Isso salvou minha vida --->
defina esta linha
ListView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
Em seu manifesto na tag de atividade, digite isto ->
<activity android:windowSoftInputMode="adjustPan">
Sua intenção habitual
fonte
Estamos tentando isso em uma lista curta que não faz nenhuma reciclagem de exibição. Por enquanto, tudo bem.
XML:
Java:
fonte
esta postagem correspondia exatamente às minhas palavras-chave. Eu tenho um cabeçalho ListView com uma pesquisa EditText e um botão de pesquisa.
Para dar foco ao EditText depois de perder o foco inicial, o único HACK que encontrei é:
Perdi muitas horas e não é uma solução real. Espero que ajude alguém difícil.
fonte
Se a lista for dinâmica e contiver widgets focalizáveis, a opção certa é usar o RecyclerView em vez do ListView IMO.
As soluções alternativas que definem
adjustPan
,FOCUS_AFTER_DESCENDANTS
ou lembram-se manualmente da posição focada, são de fato apenas soluções alternativas. Eles têm estojos de canto (rolagem + problemas no teclado virtual, mudança de posição de cursor no EditText). Eles não mudam o fato de que o ListView cria / destrói visualizações em massa durantenotifyDataSetChanged
.Com o RecyclerView, você notifica sobre inserções, atualizações e exclusões individuais. A exibição focada não está sendo recriada, portanto, não há problemas com os controles de formulário que perdem o foco. Como um bônus adicional, o RecyclerView anima as inserções e remoções de itens da lista.
Aqui está um exemplo de documentação oficial sobre como começar
RecyclerView
: Guia do desenvolvedor - Crie uma lista com o RecyclerViewfonte
algumas vezes, quando você usa
android:windowSoftInputMode="stateAlwaysHidden"
atividades manifestas ou xml, esse tempo perde o foco do teclado. Portanto, primeiro verifique essa propriedade no seu xml e manifesto, se houver, remova-a. Depois de adicionar essas opções para manifestar o arquivo na atividade paralelaandroid:windowSoftInputMode="adjustPan"
e adicionar essa propriedade à listview em xmlandroid:descendantFocusability="beforeDescendants"
fonte
Outra solução simples é definir seu onClickListener, no método getView (..), do seu ListAdapter.
Dessa forma, sua linha é clicável e sua visão interna também :)
fonte
A parte mais importante é obter o foco trabalhando para a célula da lista. Especialmente para lista no Google TV, isso é essencial:
O método setItemsCanFocus da exibição em lista faz o truque:
Minha lista de células xml começa da seguinte maneira:
nextFocusLeft / Right também são importantes para a navegação no D-Pad.
Para mais detalhes, confira as ótimas outras respostas.
fonte
Acabei de encontrar outra solução. Eu acredito que é mais um hack do que uma solução, mas funciona no Android 2.3.7 e Android 4.3 (eu até testei o bom e velho D-pad)
inicie sua webview como de costume e adicione: (obrigado Michael Bierman)
Durante a chamada getView:
fonte
Apenas tente isso
no
seção do seu manifesto. Sim, ele ajusta nada, o que significa que o editText permanecerá onde está quando o IME for aberto. Mas isso é apenas um pequeno inconveniente que ainda resolve completamente o problema de perder o foco.
fonte