Android 更改PreferenceActivity中片段的突出显示和标题颜色
我正在使用材质主题,我想更改下图中两个标记区域的颜色,即高亮颜色(#1)和细节片段中标题的颜色(#2) 我知道每个主题的颜色都有一个属性,但我就是找不到它 有什么想法吗 我知道每个颜色都有一个属性 主题,但我就是找不到 第1项 您需要的属性是 根据文件 可绘制,用作激活项目的背景 存在的理由Android 更改PreferenceActivity中片段的突出显示和标题颜色,android,android-theme,Android,Android Theme,我正在使用材质主题,我想更改下图中两个标记区域的颜色,即高亮颜色(#1)和细节片段中标题的颜色(#2) 我知道每个主题的颜色都有一个属性,但我就是找不到它 有什么想法吗 我知道每个颜色都有一个属性 主题,但我就是找不到 第1项 您需要的属性是 根据文件 可绘制,用作激活项目的背景 存在的理由 PreferenceActivity中用于每个标题项的布局是使用activatedBackgroundIndicator作为背景的。此属性需要一个选择器,例如: <selector xmlns:an
PreferenceActivity
中用于每个标题项的布局是使用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>
遍历视图层次结构
使用是处理此问题的简单方法
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);
}
});
breadcrumb.getViewTreeObserver().addOnGlobalLayoutListener(新OnGlobalLayoutListener()){
@凌驾
公共图书馆{
breadcrumb.getViewTreeObserver().removeOnGlobalLayoutListener(此);
final ArrayList outview=Lists.newArrayList();
breadcrumb.findViewsWithText(outViews,getString(R.string.your\u header\u title),
视图。查找带有文本的视图);
((TextView)outview.get(0)).setTextColor(yourTitleColor);
}
});
结果
我已经修改了建议的解决方案,现在它也可以完美地用于屏幕旋转 在基本
活动
类中,我们必须为我们的首选项执行以下操作:
@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);
}
就这样。好了,我已经测试了答案第二部分的两种解决方案,我只是想补充几点。到目前为止,反射是最简单、最可靠的方法——不过,它让人感觉不舒服。我更喜欢使用视图层次结构,但它很快就会变得复杂,因为它需要面包屑的标题,而且它还会重置在首选项类别之间切换时文本颜色的更改。您需要在PreferenceActivity中重写onDestroy,并在那里而不是在方法本身中删除布局侦听器。这是一个很好的解决方案!唯一的问题(使用反射)是,当用户从横向切换到纵向时,或者从横向切换到纵向时,标题返回到黑色。我的修正是,我认为它与“缓存片段状态”或类似的东西有关,因此我最终检测到,如果我们只是来自方向更改,我将通过调用finish()和startActivity()重新启动设置活动。它很脏,但用户看不见,而且可以工作。如果有人有更好的解决方案。。。
@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);
}