我试图找到一种方法来覆盖android样式的非公共属性,更具体地说是itemColor
样式的名为Widget.FragmentBreadCrumbs
的atttribute。当在大窗格的右窗格中显示首选项片段时,此样式会影响PreferenceActivity
中的breadcumb的文本颜色。它由班级FragmentBreadCrumbs使用。
我的应用程序使用扩展Theme.Holo.Light
的自定义主题和API 23上的主题中断,因此我试图找到一种解决方法。
上述样式将itemColor
的默认值设置为@null
,但未在Holo主题中覆盖,例如将其设置为Material主题的有效值。因此,面包屑的标题不可见(请参阅screenshot for API 19和screenshot 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();
}
答案 0 :(得分:1)
不幸的是,如果您尝试使用android:itemColor
,工具链将报告错误,因为这与公共属性名称不对应,因此您甚至无法使用此属性创建样式。
我唯一能想到的是在视图构建(/膨胀)后立即通过反射更改文本颜色。在updateCrumbs()
内首次运行FragmentBreadCrumbs
之前,您可能希望尽早完成此操作。也许您可以覆盖onCreate()
的{{1}}或PreferenceActivity
的{{1}}(此处适用),并执行以下操作:
onCreateView()