这是一个简短的问题:
我知道您可以通过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/..."/>
在我的情况下,在运行时,应用程序可以将某些内容设置为白色或深色。
是否可以在运行时将工具栏(支持库)的主题设置为具有特定主题?
至少可以将内部的项目设置为具有正确的选择器和项目色调 - 颜色,以便按下它们仍然具有可见效果(当背景颜色变暗时将背景颜色更改为白色,使效果不可见)?
答案 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
中存储一个引用,这样你就可以知道要设置哪个主题了?