更改PreferenceActivity中片段的突出显示和标题颜色

时间:2014-11-14 04:31:26

标签: android android-theme

我正在使用Material主题,我想更改下图中两个标记区域的颜色 - 即高亮颜色(#1)和细节片段中标题的颜色(# 2)。

我知道主题中每个地方的颜色都有一个属性,但我似乎无法找到它。

enter image description here

有什么想法吗?

2 个答案:

答案 0 :(得分:23)

  

我知道每个地方的颜色都有一个属性   主题,但我似乎无法找到它。

项目编号1

您需要的属性是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>

项目编号2

这个项目有点棘手。这不是您在其他答案中建议的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);
        }

    });

结果

results

答案 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);
}

那就是它。