如何覆盖android风格的私有属性

时间:2016-08-08 16:24:25

标签: android android-layout android-styles

我试图找到一种方法来覆盖android样式的非公共属性,更具体地说是itemColor样式的名为Widget.FragmentBreadCrumbs的atttribute。当在大窗格的右窗格中显示首选项片段时,此样式会影响PreferenceActivity中的breadcumb的文本颜色。它由班级FragmentBreadCrumbs使用。

我的应用程序使用扩展Theme.Holo.Light的自定义主题和API 23上的主题中断,因此我试图找到一种解决方法。

上述样式将itemColor的默认值设置为@null,但未在Holo主题中覆盖,例如将其设置为Material主题的有效值。因此,面包屑的标题不可见(请参阅screenshot for API 19screenshot for API 23

我想我想要做的是找到一种方法,可以改变主题的私有值,类似于反射可用于修改私有字段的类值的方式。或者,ContextThemeWrapper似乎很有希望,但我很简单,不知道如何使用它,或者即使它适用于我的情况。

我需要的是FragmentBreadCrumbs类在mTextColor属性下面执行其构造函数而不是@null(我猜是0),因为Android主题配置但具有有效的颜色值。

你认为这是可能的吗?

public FragmentBreadCrumbs(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);

    final TypedArray a = context.obtainStyledAttributes(attrs,
            com.android.internal.R.styleable.FragmentBreadCrumbs, defStyleAttr, defStyleRes);

    mGravity = a.getInt(com.android.internal.R.styleable.FragmentBreadCrumbs_gravity,
            DEFAULT_GRAVITY);

    mLayoutResId = a.getResourceId(
            com.android.internal.R.styleable.FragmentBreadCrumbs_itemLayout,
            com.android.internal.R.layout.fragment_bread_crumb_item);

    /* This is the value needed to be overridden */
    mTextColor = a.getColor(
            com.android.internal.R.styleable.FragmentBreadCrumbs_itemColor,
            0);

    a.recycle();
}

1 个答案:

答案 0 :(得分:1)

不幸的是,如果您尝试使用android:itemColor,工具链将报告错误,因为这与公共属性名称不对应,因此您甚至无法使用此属性创建样式。

我唯一能想到的是在视图构建(/膨胀)后立即通过反射更改文本颜色。在updateCrumbs()内首次运行FragmentBreadCrumbs之前,您可能希望尽早完成此操作。也许您可以覆盖onCreate()的{​​{1}}或PreferenceActivity的{​​{1}}(此处适用),并执行以下操作:

onCreateView()