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

Mic*_*Bak 9 android android-theme

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

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

在此输入图像描述

有任何想法吗?

adn*_*eal 23

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

项目编号1

你想要的属性是activatedBackgroundIndicator.

按照文档

Drawable用作激活项目的背景.

理由是

用于a中每个标题项的布局PreferenceActivitypreference_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>
Run Code Online (Sandbox Code Playgroud)

商品编号2

这个项目有点棘手.这不是PreferenceScreen你在另一个答案中建议的,而是FragmentBreadCrumbs标题.遗憾的是,无法使用主题设置标题颜色,因为用于设置样式的属性是私有内部.

但是,您可以使用Reflection设置文本颜色,或者只是遍历面包屑的视图层次结构,直到找到TextView用于显示标题的内容.

用于显示每个内容的布局PreferenceActivitypreference_list_content_material其中包括breadcrumbs_in_fragment_material布局显示每个面包屑.您可以从该布局中看到每个的ID FragmentBreadCrums都是android:id/title.现在我们可以使用此id来查找breadcrumb并调整其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
    }

}
Run Code Online (Sandbox Code Playgroud)

遍历视图层次结构

使用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);
        }

    });
Run Code Online (Sandbox Code Playgroud)

结果

结果