我使用的是Material主题,我想更改下图中两个标记区域的颜色-即突出显示颜色(#1)和详细信息 fragment 中标题的颜色(#2)。
我知道主题中每个位置的颜色都有一个属性,但是我似乎找不到它。
有任何想法吗?
最佳答案
商品编号1
您需要的属性是 activatedBackgroundIndicator
。
根据文档
原因是PreferenceActivity
中每个 header 项目使用的布局是 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>
商品编号2
这个项目有点棘手。它不是您在其他答案中建议的
PreferenceScreen
,而是 FragmentBreadCrumbs
标题。不幸的是,标题颜色无法使用主题设置,因为用于对其进行样式设置的属性是内部私有(private)的。但是,您可以使用Reflection或仅遍历面包屑的 View 层次结构,直到找到用于显示标题的
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 层次结构
使用
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);
}
});
结果
关于android - 在PreferenceActivity中更改 fragment 的突出显示和标题颜色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26922915/