【发布时间】:2018-05-09 14:15:52
【问题描述】:
我创建了一个带有自定义视图的库,该视图在创建时会扩展布局。布局中的视图使用style="?attr/labelStyle" 或任何其他属性设置样式。
该属性被声明为库的attrs.xml:
<attr name="myViewStyle" format="reference"/>
<declare-styleable name="MyView">
<attr name="labelStyle" format="reference|color"/>
</declare-styleable>
我在库的styles.xml 中为这个属性设置了一个默认值:
<style name="MyViewStyle">
<item name="labelStyle">@style/LabelStyle</item>
</style>
<style name="LabelStyle">
<item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="...">...</item>
</style>
最后在图书馆的themes.xml:
<style name="MyViewStyleLight" parent="Theme.AppCompat.Light">
<item name="myViewStyle">@style/MyViewStyle</item>
</style>
现在这是库的默认样式,但它在主项目styles.xml中被覆盖
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="myViewStyle">@style/MyViewStyleCustom</item>
</style>
<style name="MyViewStyleCustom" parent="MyViewStyleLight">
<item name="android:textColor">@color/gray</item>
<item name="...">...</item>
</style>
自定义视图代码:
public MyView(Context context) {
this(context, null, R.attr.myViewStyle, 0);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, R.attr.myViewStyle, 0);
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(createThemeWrapper(context, R.attr.myViewStyle, R.style.MyViewStyleLight),
attrs, defStyleAttr, defStyleRes);
initLayout();
}
private static Context createThemeWrapper(Context context, int styleAttr, int defaultStyle) {
final TypedArray ta = context.obtainStyledAttributes(new int[]{styleAttr});
int style = ta.getResourceId(0, defaultStyle);
ta.recycle();
return new ContextThemeWrapper(context, style);
}
private void initLayout() {
LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.my_view, this);
...
}
我在下面解释了 ContextThemeWrapper。现在应用程序在布局膨胀的那一行崩溃。这是崩溃日志的重要部分:
android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class com.example.MyView
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
[...]
Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 13: TypedValue{t=0x2/d=0x7f030057 a=-1}
at android.content.res.TypedArray.getDrawable(TypedArray.java:867)
[...]
布局充气器找不到属性的值。当我试图通过代码获取属性时,它什么也不返回。该属性实际上存在,只是它没有设置任何值,即使我已经明确设置了。
我应该如何设置我的库的样式?我几乎可以肯定,我所做的每一件事都与SublimePicker library 相同,但它就是行不通。与 ContextThemeWrapper 的部分有一点不同,但这可能不是问题。感觉好像在什么地方忘记了一个小东西,让属性没有价值,什么东西没有联系,不知道。
我知道这是一个很长的问题,但它不能更简洁,我尽可能地简化了所有内容。我更改了以前版本问题中的大部分信息,使其完全不同。这两个答案现在根本不相关,而不是曾经如此。赏金是自动奖励的。
如果这对某人有帮助,我可以将下载添加到我的实际项目中,但正如我所说,这个简化的示例与我的项目具有完全相同的形式。
【问题讨论】:
-
您说您已在库和活动中为该属性设置了一个值,但我在您的问题中只看到一个
<style>定义。那个确切的代码在两个地方都重复了吗?此外,您说您尝试从库中扩充布局;你到底是怎么做的?我猜测问题出在哪里,但我宁愿不要在不知道的情况下发布答案。
标签: android android-fragments android-styles android-library