2016-02-02 2 views
0

J'ai un AppBarLayout défini comme telthème Changement AppBarLayout programatically

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

Cependant, parfois je change le thème de l'application et je veux aussi changer, et ses enfants de. J'ai réussi partiellement en faisant ceci:

AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appbar_layout); 
    appBarLayout.getContext().setTheme(R.style.AppTheme_Dark_AppBarOverlay); 
    appBarLayout.invalidate(); 

Cependant, le TextView pour le titre n'obtient pas les arrangements de thème.

Comment puis-je le définir?

Répondre

0

La solution à ceci était d'utiliser un ViewStub (http://developer.android.com/reference/android/view/ViewStub.html) qui contenait deux versions de mon AppBarLayout: Light et Dark.

Puis dans onCreate J'ai vérifié quel thème était chargé et remplacé le ViewStub avec le R.layout correct. Je ne sais pas pourquoi c'est si difficile, ou pourquoi vous ne pouvez pas changer le «thème» pour les sous-vues lorsque vous changez le thème pour l'ensemble de l'activité, c'est vraiment perplexe.

En tout cas, c'était la seule solution qui a fonctionné pour moi.

1

De l'documentation for Context.setTheme():

Définir le thème de base pour ce contexte. Notez que cela doit être appelé avant que toutes les vues soient instanciées dans le contexte (par exemple, avant en appelant setContentView (View) ou inflate (int, ViewGroup)).

La dernière ligne est que la définition du thème sur un Context affecte les vues créées ultérieurement. Cela signifie que vous devrez reconstruire votre mise en page après setTheme().

+0

C'est vrai, mais je le mets sur AppBarLayout, pas toute l'application. J'ai utilisé getContext() car il semble que le contexte pour AppBarLayout ne soit pas le même que le tout. Si j'ai besoin de reconstruire juste une partie de celui-ci (je peux l'obtenir avant les builds de vue, je suppose), comment puis-je faire cela – automaton

+0

Vous devrez reconstruire le AppBarLayout au minimum. Vous pouvez utiliser un [ContextThemeWrapper] (http://developer.android.com/reference/android/view/ContextThemeWrapper.html) sur le contexte de base pour regonfler les vues avec un autre thème. De cette façon, votre contexte de base n'est pas affecté. – Krylez

+0

N'y a-t-il pas d'autre moyen de configurer android: theme sur un AppBarLayout? Cela n'a aucun sens, pourquoi avoir des thèmes sur les widgets si vous ne pouvez pas les changer? – automaton