从R.style创建AttributeSet

时间:2012-08-28 14:50:32

标签: android

我有一个我在循环中实例化的自定义组件,它们都需要应用相同的样式。由于它是一个自定义组件(特别是LinearLayout的子类),我不能只在XML中设置style属性,因为组件的布局XML的根标签是一个合并(以保存使视图层次结构太疯狂)。我发现了这个:

How can I create an AttributeSet from a style.xml?

其中几乎完全描述了我的问题。只有答案是无用的 - 我的R.java很新鲜,风格就在那里。我认为问题是getResources()。getXml(R.style.my_style)实际上没有查看/res/values/styles.xml文件?

我正在使用Scala,所以语法有点......更好。我的组成部分:

class MyLinearLayout(object : MyDatabaseObject, context : Context, attrs : AttributeSet = null) 
        extends LinearLayout(context, attrs) {
    // Shows and interacts with the data in object
}

在活动中:

val componentStyle = Xml.asAttributeSet(getResources.getXml(R.style.my_style))
for (obj <- dbResults) viewGroup.addView(new MyLinearLayout(obj, this, componentStyle))

第一行抛出一个Resources.NotFoundException。样式本身在res / values / styles.xml中,以及其余的样式,并在不同的活动中应用于LinearLayouts,因此这不是问题。

1 个答案:

答案 0 :(得分:2)

不幸的是,无法使用R.style.your_style引用以编程方式设置视图的样式。有许多SO帖子证实了这一点,但是通过创建应用了样式的xml布局或可绘制文件,可以解决各种问题。我认为这可能适用于您的情况,因为所有组件都以相同的方式使用相同的所需属性创建(让我们说它在drawable / custom_view中:

<?xml version="1.0" encoding="utf-8"?>
<com.your.CustomView xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="pick_your_width"
   android:layout_height="pick_your_height"
   style="@style/your_style" />

然后在添加自定义视图时使用:

CustomView newView = (CustomView)getLayoutInflater().inflate(R.drawable.custom_view, null);

很抱歉这不适合您的情况,但这是我找到的最佳解决方案,可以有条不紊地将一种风格应用于自定义视图,而不会弄乱您的Java。根据找到的解决方案here