Estou tentando definir o tema de um fragmento.
Definir o tema no manifesto não funciona:
android:theme="@android:style/Theme.Holo.Light"
Olhando para blogs anteriores, parece que tenho que usar um ContextThemeWrapper. Alguém pode me indicar um exemplo codificado? Não consigo encontrar nada.
android
android-fragments
android-theme
user1232691
fonte
fonte
Fragment toma seu tema de sua atividade. Cada fragmento é atribuído ao tema da atividade em que existe.
O tema é aplicado no método Fragment.onCreateView, onde seu código cria visualizações, que são na verdade objetos onde o tema é usado.
Em Fragment.onCreateView você obtém o parâmetro LayoutInflater, que aumenta as visualizações e mantém o Contexto usado para o tema, na verdade, esta é a Activity. Portanto, suas visualizações infladas usam o tema de Activity.
Para substituir o tema, você pode chamar LayoutInflater.cloneInContext , que menciona no Docs que pode ser usado para alterar o tema. Você pode usar ContextThemeWrapper aqui. Em seguida, use o inflater clonado para criar visualizações do fragmento
fonte
Para aplicar um único estilo, usei apenas
no
onCreateView()
fragmento antes de inflar a visão da raiz do fragmento e funciona para mim.fonte
getContext()
Eu também estava tentando fazer com que meu diálogo de fragmento fosse exibido com um tema diferente para sua atividade e segui esta solução . Como algumas pessoas mencionadas nos comentários, eu não estava fazendo funcionar e o diálogo continuava aparecendo com o tema especificado no manifesto. O problema acabou sendo que eu estava construindo o diálogo usando
AlertDialog.Builder
oonCreateDialog
método e, portanto, não estava fazendo uso doonCreateView
método como mostrado na resposta que vinculei. E quando estava instanciando oAlertDialog.Builder
, estava passando no contexto usandogetActivity()
quando deveria estar usando o instanciadoConstextThemeWrapper
.Aqui está o código para meu onCreateDialog:
Eu originalmente tive o
AlertDialog.Builder
ser instanciado da seguinte maneira:que mudei para:
Após esta alteração, a caixa de diálogo do fragmento foi exibida com o tema correto. Portanto, se alguém mais está tendo um problema semelhante e está fazendo uso do
AlertDialog.Builder
, verifique o contexto que está sendo passado para o construtor. Espero que isto ajude! :)fonte
Certifique-se de ter
android:minSdkVersion="11"
definido em seu manifesto. Esse pode ser o motivo pelo qual o exemplo de Davi não funcionou para você.Além disso, defina o
android:theme="@android:style/Theme.Holo.Light"
atributo para a<application>
tag e NÃO a<activity>
tag.Outro possível problema pode ser a maneira como você obtém seu Contexto ao usar um
ContextThemeWrapper()
. Se você usar algo como,getActivity().getApplicationContext()
basta substituí-lo porgetActivity()
.Normalmente, o Theme.Holo deve ser aplicado aos Fragments vinculados à MainActivity.
Observe que você usa um ContextThemeWrapper quando deseja aplicar um tema diferente para o seu Fragment. Pode ajudar se você fornecer a parte do código, de sua MainActivity, onde você adiciona seus Fragments.
Alguns links úteis:
ListView personalizado no fragmento não aderindo ao tema pai
fonte
Eu tentei a solução que David sugeriu que funcionou, mas não em todos os cenários:
1. para o primeiro fragmento adicionado à pilha tem o tema da atividade e não aquele definido em onCrateView, mas no segundo fragmento que i adicione à pilha corrija-os foi aplicado no fragmento.
2. No segundo fragmento em que os mesmos foram exibidos corretamente, fiz o seguinte: forcei o aplicativo a ser fechado limpando a memória, reabrindo o aplicativo e quando a atividade foi recriada com o fragmento O fragmento alterou os errados a Activity e não a mesma que foi configurada no onCrateView do fragmento.
Para corrigir o problema, fiz uma pequena alteração e substituí o argumento do contêiner de inflater.inflate por um nulo.
Não sei como o inflador usa em alguns cenários o contexto da visualização do contêiner.
Observação - estou usando android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity.
fonte
Eu sei que é um pouco tarde, mas pode ajudar alguém porque isso me ajudou. Você também pode tentar adicionar a linha de código abaixo dentro da função onCreatView do fragmento
fonte
Crie uma classe java e, em seguida, use o layout cujo tema deseja alterar no método onCreate. Em seguida, mencione-o no manifesto normalmente
fonte
Se você deseja apenas aplicar o estilo a um fragmento específico, basta adicionar essas linhas antes de chamar
onCreateView()
ouonAttach()
do fragmento,e se você deseja definir a barra de status transparente, defina false para a
fitsSystemWindows
propriedade do seu layout raiz,fonte
Eu tenho que trabalhar definindo o tema no contexto do fragmento antes de chamar o inflator.
NOTA: Este é um exemplo para Xamarin.Android em combinação com MvvmCross. Não tenho 100% de certeza se isso também funcionará para os programadores Java. Mas você pode tentar :)
O código do método de extensão SetTheme
Espero que isso ajude algumas pessoas, saúde!
fonte
Resolvi o problema usando
android:theme = "@style/myTheme"
no arquivo de layout do fragmento. Por exemplo, isso muda o estilo doLinearLayout
e seu conteúdo, mas nada fora doLinearLayout
. Portanto, para decorar todo o fragmento com qualquer estilo, aplique o tema ao layout pai mais externo.Nota: Caso ainda não tenha encontrado uma solução, você pode tentar.
fonte
você pode tentar isso para pirulito em onAttach
janela final da janela = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)
e defini-lo de volta para o padrão em ondettach
fonte