Android - ExpandableListView Altere o plano de fundo para itens infantis
-
19-09-2019 - |
Pergunta
estou a usar ExpandableListView
no meu aplicativo e uma das reclamações que recebo dos usuários é que quando o List
O item é expandido, é difícil distinguir visualmente onde o item infantil termina e o próximo item de grupo começa.
Então, eu gostaria de mudar o fundo da criança List
item para a sombra diferente.
Tentativas brutais que fiz até agora foram baseadas em mudar diretamente a cor e o texto dos elementos dentro da criança View
Item, mas isso leva à perda de pau e destaques. Então, minha pergunta é - o que é uma boa estratégia para alcançar o acima?
eu tentei styles
e selectors
Mas o que realmente me incomoda é se eu mudar de plano de fundo para o item infantil, então preciso adicionar selectors
Para todas as combinações de foco/ativado etc. Quando tudo estou tentando fazê -lo para substituir uma única coisa.
Existe uma maneira de herdar pai style
E definir background
apenas para o item infantil habilitado e não focado com outro styles
retido?
Solução
Nós iremos. Aqui está o que funcionou para mim:
- Create list_background.xml no seu projeto
res/drawable
diretório - Defina o valor de fundo do layout de nível superior do seu item filho para o desenhado acima. Se você está coçando a cabeça neste momento - estou me referindo ao arquivo de layout XML que é usado quando você cria a visão infantil da sua lista expansível em
ExpandableListAdapter#getChildView
Aqui está o arquivo desenhado completo
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:state_enabled="true"
android:drawable="@drawable/list_highlight_active" />
<item android:state_enabled="true" android:state_selected="true"
android:state_window_focused="true"
android:drawable="@drawable/list_highlight_inactive" />
<item android:state_enabled="true" android:state_window_focused="true"
android:drawable="@color/item_body" />
<item android:drawable="@color/item_body" />
</selector>
Eu tive que copiar list_highlight_active.xml
e list_highlight_inactive.xml
a partir de /android-sdk-windows-1.6_r1/platforms/android-1.5/data/res/drawable
ao diretório desenhado do meu projeto. @color/item_body
é apenas um tom de cinza
Outras dicas
Acabei de descobrir uma maneira de "um pouco" definir a cor de fundo sem ter que pular através dos aros do seletor.
Como você observou, definir o plano de fundo para uma cor sólida elimina os destaques do seletor, porque a nova cor de fundo a obscurece. A Droidin tem o que é a solução normal: forneça ao seu próprio seletor de fundo as cores exatas que você deseja. É uma dor dizer o mínimo.
Mas se tudo o que você quer é uma pequena diferenciação de cores, há uma maneira mais simples: Alpha Blend. Defina a cor do seu plano de fundo com um valor alfa. Por exemplo, defina um plano de fundo como "#bbffffff". Os dois primeiros dígitos indicam o nível alfa. Tudo se misturará para que o fundo não seja um branco puro e o destaque da seleção não seja o laranja brilhante normal, mas as crianças serão uma cor diferente e o destaque ainda funciona. Ganha-ganha.
Eu procuro uma solução semelhante. Você pode tentar obter visualização pai no método adaptador getChieldView. Eu acho que esse pai é uma visão pai de todos os seus Chields. E defina plano de fundo do recurso para esse pai. Eu faço assim:
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.fa_report_sub_item, null);
View parentGroup=(View) convertView.getParent();
parentGroup.setBackgroundResource(R.drawable.fa_summ_report_main_item);
}