Antes de tudo, esta pergunta faz uma pergunta muito semelhante. No entanto, minha pergunta tem uma diferença sutil.
O que eu gostaria de saber é se é possível alterar programaticamente o colorPrimary
atributo de um tema para uma cor arbitrária ?
Então, por exemplo, temos:
<style name="AppTheme" parent="android:Theme.Material.Light">
<item name="android:colorPrimary">#ff0000</item>
<item name="android:colorAccent">#ff0000</item>
</style>
Em tempo de execução, o usuário decide que deseja usar #ccffff
como uma cor primária. Claro que não há como criar temas para todas as cores possíveis.
Não me importo se eu tiver que fazer coisas hacky, como confiar nos internos privados do Android, desde que funcione usando o SDK público.
Meu objetivo é eventualmente ter os ActionBar
e todos os widgets como um CheckBox
para usar esta cor primária.
android
android-5.0-lollipop
nhaarman
fonte
fonte
Respostas:
Os temas são imutáveis, você não pode.
fonte
Eu li os comentários sobre o aplicativo de contatos e como ele usa um tema para cada contato.
Provavelmente, o aplicativo de contatos tem alguns temas predefinidos (para cada cor primária do material a partir daqui: http://www.google.com/design/spec/style/color.html ).
Você pode aplicar um tema antes do método setContentView dentro do método onCreate.
Em seguida, o aplicativo de contatos pode aplicar um tema aleatoriamente a cada usuário.
Este método é:
Mas esse método tem um problema, por exemplo, ele pode alterar a cor da barra de ferramentas, a cor do efeito de rolagem, a cor da ondulação, etc.
Em seguida, para resolver esse problema, você pode usar o método antes e:
Este método dois altera a cor da barra de navegação e status. Lembre-se, se você definir sua barra de navegação como translúcida, não poderá mudar sua cor.
Este deve ser o código final:
Você pode usar um comutador e gerar um número aleatório para usar temas aleatórios ou, como no aplicativo de contatos, cada contato provavelmente tem um número predefinido associado.
Uma amostra do tema:
Desculpe pelo meu Inglês.
fonte
Você pode usar Theme.applyStyle para modificar seu tema em tempo de execução, aplicando outro estilo a ele.
Digamos que você tenha essas definições de estilo:
Agora você pode corrigir seu tema em tempo de execução da seguinte forma:
O método
applyStyle
deve ser chamado antes que o layout seja inflado! Portanto, a menos que você carregue a visualização manualmente, aplique estilos ao tema antes de chamarsetContentView
sua atividade.Obviamente, isso não pode ser usado para especificar uma cor arbitrária, ou seja, uma entre 16 milhões (256 3 ) cores. Mas se você escrever um pequeno programa que gere as definições de estilo e o código Java para você, algo como um em 512 (8 3 ) deve ser possível.
O que torna isso interessante é que você pode usar sobreposições de estilos diferentes para diferentes aspectos do seu tema. Basta adicionar algumas definições de sobreposição,
colorAccent
por exemplo. Agora você pode combinar valores diferentes para cor primária e cor de destaque quase arbitrariamente.Você deve garantir que suas definições de tema de sobreposição não herdam acidentalmente várias definições de estilo de uma definição de estilo pai. Por exemplo, um estilo chamado
AppTheme.OverlayRed
implicitamente herda todos os estilos definidosAppTheme
e todas essas definições também serão aplicadas quando você corrigir o tema principal. Portanto, evite pontos nos nomes dos temas de sobreposição ou use algo comoOverlay.Red
e definaOverlay
como um estilo vazio.fonte
applyStyle
antes de ligarsetContentView
para sua atividade e ela deve funcionar.Eu criei uma solução para criar temas de qualquer cor, talvez isso possa ser útil para alguém. API 9+
1. primeiro crie " res / values-v9 / " e coloque este arquivo: styles.xml e a pasta regular "res / values" será usada com seus estilos.
2. coloque esse código em seu res / values / styles.xml:
3. no AndroidManifest:
4) crie uma nova classe com o nome "ThemeColors.java"
5) MainActivity:
Para mudar a cor, substitua o Random pelo RGB. Espero que ajude.
Há um exemplo completo: ColorTest.zip
fonte
context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));
você pode me dar uma explicação ou um link para acompanhar esse tópico?Usei o código do Dahnark, mas também preciso alterar o plano de fundo da barra de ferramentas:
fonte
Você não pode alterar a cor do colorPrimary, mas pode alterar o tema do seu aplicativo adicionando um novo estilo com uma cor diferente
e dentro do tema do conjunto de atividades
fonte
de uma atividade que você pode fazer:
fonte
USE UMA BARRA DE FERRAMENTAS
Você pode definir uma cor de item da barra de ferramentas personalizada dinamicamente criando uma classe de barra de ferramentas personalizada:
depois consulte-o no seu arquivo de layout. Agora você pode definir uma cor personalizada usando
Fontes:
Encontrei as informações para fazer isso aqui: Como alterar dinamicamente a cor dos ícones da Barra de Ferramentas Android
e depois editei, aprimorei e publiquei aqui: GitHub: AndroidDynamicToolbarItemColor
fonte
Isto é o que você PODE fazer:
escrever um arquivo na pasta drawable, vamos chamá-lo de background.xml
em seguida, defina o layout (ou o que quer que seja o caso)
android:background="@drawable/background"
ao definir seu tema, essa cor representaria a mesma.
fonte