Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改PreferenceActivity中片段的突出显示和标题颜色_Android_Android Theme - Fatal编程技术网

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

Android 更改PreferenceActivity中片段的突出显示和标题颜色,android,android-theme,Android,Android Theme,我正在使用材质主题,我想更改下图中两个标记区域的颜色,即高亮颜色(#1)和细节片段中标题的颜色(#2) 我知道每个主题的颜色都有一个属性,但我就是找不到它 有什么想法吗 我知道每个颜色都有一个属性 主题,但我就是找不到 第1项 您需要的属性是 根据文件 可绘制,用作激活项目的背景 存在的理由 PreferenceActivity中用于每个标题项的布局是使用activatedBackgroundIndicator作为背景的。此属性需要一个选择器,例如: <selector xmlns:an

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

我知道每个主题的颜色都有一个属性,但我就是找不到它

有什么想法吗

我知道每个颜色都有一个属性 主题,但我就是找不到

第1项 您需要的属性是

根据文件

可绘制,用作激活项目的背景

存在的理由

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