2

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

如何从 style.xml 创建 AttributeSet?

这几乎准确地描述了我的问题。只有答案是无用的——我的 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,所以这不是问题。

4

1 回答 1

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.util.View 。基于在此处找到的解决方案。

于 2012-08-29T18:38:05.163 回答