我正在使用Material主题,我想更改下图中两个标记区域的颜色 - 即高亮颜色(#1)和细节片段中标题的颜色(# 2)。
我知道主题中每个地方的颜色都有一个属性,但我似乎无法找到它。
有什么想法吗?
答案 0 :(得分:23)
我知道每个地方的颜色都有一个属性 主题,但我似乎无法找到它。
您需要的属性是activatedBackgroundIndicator
。
根据文档
Drawable用作激活项目的背景。
原因
PreferenceActivity
中每个标题项使用的布局为preference_header_item_material
,后者使用activatedBackgroundIndicator
作为背景。你需要一个这个属性的选择器,如:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true"><color android:color="yourColor" />
</item>
<item><color android:color="@android:color/transparent" />
</item>
</selector>
这个项目有点棘手。这不是您在其他答案中建议的PreferenceScreen
,而是FragmentBreadCrumbs
标题。不幸的是,标题颜色无法使用主题设置,因为用于设置样式的属性是私有内部。
然而,您可以使用Reflection设置文本颜色,或者只是遍历面包屑的视图层次结构,直到找到用于显示标题的TextView
。
用于显示每个PreferenceActivity
内容的布局为preference_list_content_material
,其中包含显示每个面包屑的breadcrumbs_in_fragment_material
布局。您可以从该布局中看到每个FragmentBreadCrums
的ID为android:id/title
。现在我们可以使用此ID来查找面包屑并调整其中的TextView
。
使用反思
@Override
public void onBuildHeaders(List<Header> target) {
super.onBuildHeaders(target);
loadHeadersFromResource(R.xml.yourPreferenceHeaders, target);
final View breadcrumb = findViewById(android.R.id.title);
if (breadcrumb == null) {
// Single pane layout
return;
}
try {
final Field titleColor = breadcrumb.getClass().getDeclaredField("mTextColor");
titleColor.setAccessible(true);
titleColor.setInt(breadcrumb, yourTitleColor);
} catch (final Exception ignored) {
// Nothing to do
}
}
遍历视图层次结构
使用View.findViewsWithText
是处理此问题的简单方法。
breadcrumb.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
breadcrumb.getViewTreeObserver().removeOnGlobalLayoutListener(this);
final ArrayList<View> outViews = Lists.newArrayList();
breadcrumb.findViewsWithText(outViews, getString(R.string.your_header_title),
View.FIND_VIEWS_WITH_TEXT);
((TextView) outViews.get(0)).setTextColor(yourTitleColor);
}
});
答案 1 :(得分:0)
我修改了建议的解决方案,现在它也适用于屏幕旋转。
在我们偏好的基础Activity
课程中,我们必须执行以下操作:
@Override
public View onCreateView(String name, Context context, AttributeSet attrs)
{
if ("android.app.FragmentBreadCrumbs".equals(name))
{
final View title = new android.app.FragmentBreadCrumbs(context, attrs);
try {
final Field titleColor = title.getClass().getDeclaredField("mTextColor");
titleColor.setAccessible(true);
titleColor.setInt(title, title_color));
} catch (final Exception ignored) {
// Nothing to do
}
return title;
}
return super.onCreateView(name, context, attrs);
}
那就是它。