以编程方式更改AppBarLayout主题?

时间:2016-02-02 20:56:07

标签: android styles themes android-appbarlayout

我有一个AppBarLayout定义为

<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">

但是,有时我会更改应用程序的主题,我也想更改它和它的子项。这样做我获得了部分成功:

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

但是,标题的TextView没有获得主题设置。

我该如何设置?

2 个答案:

答案 0 :(得分:1)

来自documentation for Context.setTheme()

  

为此上下文设置基本主题。请注意,这应该被调用   在上下文中实例化任何视图之前(例如之前)   调用setContentView(View)或inflate(int,ViewGroup))。

底线是在Context上设置主题会影响稍后创建的视图。这意味着您必须在setTheme()之后重建布局。

答案 1 :(得分:0)

解决这个问题的方法是使用一个ViewStub(http://developer.android.com/reference/android/view/ViewStub.html),它有两个版本的AppBarLayout:Light and Dark。

然后在onCreate中,我检查了正在加载的主题,并用正确的R.layout替换了ViewStub。我不知道为什么这么难,或者为什么当你改变整个Activity的主题时你不能改变子视图的'主题',这真的很令人困惑。

无论如何,这是唯一对我有用的解决方案。