我有一个包含几个简单视图的自定义视图组。如何设置我的视图组的样式,以便某些属性到达某些子元素?例如,在下面的示例中,如何创建允许轻松更改文本大小,颜色等的样式。如果可能的话,我想在CustomViewGroup上设置xml样式。我可以在创建样式时指定ID,以便特定元素获得它吗?
使用示例:
<com.example.CustomViewGroup
android:id="@+id/custom"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
视图组的XML:
<TextView
android:id="@+id/valueTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/descriptionTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/valueTextView"
android:layout_alignLeft="@id/valueTextView"
android:layout_marginTop="-4dip"
android:layout_marginLeft="26dip"/>
</RelativeLayout>
如果此视图的样式在整个时间内都是相同的,这不是问题,但我想在不同的情况下使用不同的样式,所以我可以让它在我的应用程序的某些区域更大但在其他区域更小
提前致谢!
答案 0 :(得分:0)
根据@Luksprog的评论,我能够走上一条通向不那么完美但又不够丑陋的道路的道路。
由于不是在我的ViewGroup构造函数中创建和添加视图并且从xml文件中膨胀,我不能只添加引用样式的属性(请参阅this)。所以我最终创建了一个enum属性,可以在我想要的视图之间切换各种样式。然后在构造函数中,我根据此属性对不同的布局(在xml中设置样式)进行了膨胀。
示例:
public CustomViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initialize(context, attrs, defStyleAttr);
}
private void initialize(Context context, AttributeSet attrs, int defStyleAttr) {
if (attrs != null) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomViewGroup, defStyleAttr, 0);
int style = a.getInt(R.styleable.CustomViewGroup_styleType, 0);
switch (style) {
case 0:
View.inflate(context, R.layout.custom_view_group_small, this);
break;
case 1:
View.inflate(context, R.layout.custom_view_group_large, this);
break;
default:
View.inflate(context, R.layout.custom_view_group_large, this);
break;
}
...
}
}
同样不是最优雅的解决方案,但它适用于我,我现在可以非常轻松地更新样式,而无需更改大量文件。