Quero ter 2 temas selecionáveis para meu aplicativo. Para fazer isso, defini alguns atributos, como este:
<attr format="color" name="item_background" />
Então, criei os dois temas, assim:
<style name="ThemeA">
<item name="item_background">#123456</item>
</style>
<style name="ThemeB">
<item name="item_background">#ABCDEF</item>
</style>
Este método funciona muito bem, permitindo-me criar e modificar vários temas facilmente. O problema é que parece que só pode ser usado em Views, e não em Drawables .
Por exemplo, fazer referência a um valor de uma Visualização dentro de um layout funciona:
<TextView android:background="?item_background" />
Mas fazer o mesmo em um Drawable não:
<shape android:shape="rectangle">
<solid android:color="?item_background" />
</shape>
Recebo este erro ao executar o aplicativo:
java.lang.UnsupportedOperationException: Can't convert to color: type=0x2
Se em vez de ?item_background
usar uma cor codificada, funciona, mas isso não me permite usar meus temas. Eu também tentei ?attr:item_background
, mas acontece o mesmo.
Como posso fazer isso? E por que funciona em visualizações, mas não em Drawables? Não consigo encontrar essa limitação em nenhum lugar da documentação ...
fonte
Respostas:
Em minha experiência, não é possível fazer referência a um atributo em um drawable XML.
Para criar seu tema, você precisa:
Inclua a cor necessária em seu drawable diretamente com a
@color
tag ou formato #RGB.Crie um atributo para seu drawable em attrs.xml .
Adicione seu drawable ao seu theme.xml .
Referencie seu drawable em seu layout usando seu atributo.
fonte
Começando com
lollipop
(API 21), este recurso é compatível, consulte https://code.google.com/p/android/issues/detail?id=26251No entanto, se você está almejando dispositivos sem pirulito, não o use, pois pode travar, use a solução alternativa na resposta aceita.
fonte
Embora não seja possível fazer referência a atributos de estilo de drawables em dispositivos pré-Lollipop , é possível para listas de estados de cores. Você pode usar o método AppCompatResources.getColorStateList (Context context, int resId) da Android Support Library. A desvantagem é que você terá que definir essas listas de estados de cores programaticamente.
Aqui está um exemplo muito básico.
color / my_color_state.xml
Um widget que precisa de uma lista de estados de cores:
E o mais importante:
Bem, não é o caminho mais elegante ou mais curto, mas é isso que a Android Support Library faz para funcionar em versões mais antigas (pré-Lollipop) do Android.
Infelizmente, o método semelhante para drawables não funciona com atributos de estilo.
fonte
Respondi à mesma pergunta em https://stackoverflow.com/a/59467269/3841352, mas também a postarei aqui:
Eu encontrei o mesmo problema e desde 2019 não foi resolvido, então você não pode ter um atributo referenciado em um seletor como um drawable. Vou compartilhar a solução que obtive para o problema, pois não a vejo postada aqui. Eu encontrei no último comentário do relatório de bug .
A solução alternativa é basicamente criar um recurso drawable que será aquele que fará referência ao valor do atributo.
Para ilustrar seu caso, a solução seria em vez de:
você substituiria? attr / * por um recurso drawable:
Os drawables seriam definidos como:
drawable / colorPrimaryDrawable
drawable / colorPrimaryDarkDrawable
Espero que ajude!!
fonte
Como @marmor declarou, isso agora é compatível com a API 21. Mas para aqueles que precisam de suporte para versões legadas do Android, você pode usar este recurso. Usando a biblioteca de suporte v7, você ainda pode usá-la em aplicativos com nível mínimo de SDK até 7.
O
AppCompatImageView
na Biblioteca de Suporte do Android v7 tem uma implementação livre de bugs desse recurso. Basta substituir seus usos deImageView
porAppCompatImageView
.fonte