是否可以在运行时设置工具栏的样式?

时间:2016-03-29 09:12:32

标签: android android-support-library android-toolbar android-theme

这是一个简短的问题:

我知道您可以通过XML创建一个具有指定主题的工具栏,例如(link):

<android.support.v7.widget.Toolbar
    android:id="@+id/..."
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:title="@string/..."/>

在我的情况下,在运行时,应用程序可以将某些内容设置为白色或深色。

是否可以在运行时将工具栏(支持库)的主题设置为具有特定主题?

至少可以将内部的项目设置为具有正确的选择器和项目色调 - 颜色,以便按下它们仍然具有可见效果(当背景颜色变暗时将背景颜色更改为白色,使效果不可见)?

2 个答案:

答案 0 :(得分:1)

正如我发现的那样,这是不可能的。

但是,我可以使用ViewStub,当需要将工具栏设置为正确的样式时,我可以这样做:

<强> dark_toolbar.xml

public class DebugFormatter extends OneLineFormatter {
    public static Formatter withClassOutputOnly() {
        return new DebugFormatter("");
    }

    public static Formatter withPackageFromRoot(String rootName) {
        return new DebugFormatter(rootName);
    }

    private DebugFormatter(String rootName) {<same as OneLineFormatter(String)>}

    @Override
    private String formatRecord(LogRecord record) {<code>} 

}

<强> light_toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar"/>

代码:

            <ViewStub
                android:id="@+id/..."
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"/>

如果我需要“更改工具栏的主题”,在它已经显示之后,我可以使用一个2个工具栏的viewSwitcher(每个不同的主题),并为每个函数调用一个,为它做其他也是。当我需要在主题之间切换时,我可以在viewSwitcher中切换视图。

与切换主题不同,但仍然是一个很好的解决方法。

答案 1 :(得分:0)

Toolbar类中有一个名为
的方法 的 setPopupTheme();

  

指定在弹出弹出菜单时使用的主题。默认情况下,使用与工具栏本身相同的主题。

只需更改工具栏背景/弹出式主题,即可创建扩展 class 的自定义 Toolbar ,然后您可以将事件发布到它可以动态更改当前堆栈中所有background/popup theme的{​​{1}}。

例如,假设您对如何使用Activity/Fragments有所了解,请考虑下面的课程:

EventBus

ThemeModel 只是一个普通的java类,传递给 public class ThemeableToolbar extends Toolbar { private boolean isSemiTransparent; public ThemeableToolbar(Context context) { super(context); init(); } public ThemeableToolbar(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ThemeableToolbar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { if (isInEditMode()) return; int primary = PrefHelper.getInt(PrefConstant.PRIMARY_COLOR); if (primary == 0) { primary = ActivityCompat.getColor(getContext(), R.color.primary); } if (isSemiTransparent()) { AnimUtil.animateColorChange(this, ColorUtils.setAlphaComponent(primary, 40), null); } else { AnimUtil.animateColorChange(this, primary, null); } } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (isInEditMode()) return; if (!EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().register(this); } } @Override protected void onDetachedFromWindow() { if (isInEditMode()) return; if (EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this); } super.onDetachedFromWindow(); } public void onEvent(ThemeModel themeModel) { init(); } public boolean isSemiTransparent() { return isSemiTransparent; } public void setIsSemiTransparent(boolean isSemiTransparent) { this.isSemiTransparent = isSemiTransparent; setBackgroundColor(ColorUtils.setAlphaComponent(ViewHelper.getPrimaryColor(getContext()), 40)); } } EventBus来通知它。

修改以便能够更改整个onEvent我建议你有Activity Theme注册要传递给它的事件以及何时收到该事件后,您应该通过调用BaseActivity重新创建您的活动,这将导致重新创建扩展recreate();的活动。在BaseActivity中致电super.onCreate(....)之前,请确保设置所需的主题。也许在android BaseActivity中存储一个引用,这样你就可以知道要设置哪个主题了?