背景
我发现样式属性在 merge 标记上不起作用,可以单独应用属性或应用样式。
已知解决方案
在使用布局工作的标记上应用样式属性。例如,包含标记和自定义标记。
只是不要使用合并。
以编程方式应用样式。
但是,我正在寻找更好的解决方案。
为什么吗
很乱。我每次使用布局时都必须应用样式属性。我把它作为一个单独的布局,因为它们可以重复使用。
我故意使用 merge 标记,因为它们必须是父布局的直接子项。例如,标签是 LinearLayout 的子项。我应用 layout_width =“0dp”和 layout_weight =“1”使它们在父布局中同样跨越。
原因#2 plus 标记以编程方式生成。因此,我只能以编程方式应用样式。这很难看,维护需要额外的努力。
目标
令人满意的解决方法。
用于插图目的的XML标记
<merge xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/CustomStyle">
<!-- Omitted -->
</merge>
和的
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
<!-- Omitted -->
</merge>
上述两个标签都没有设置样式。
答案 0 :(得分:2)
属性将被忽略。当XML解析器看到合并标记时,它会告诉它“跳过此标记并直接添加所有子项。”
答案 1 :(得分:0)
我坐在这个小东西上已经有一段时间了,所以我想我会分享。
这很简单,您可以指定要使用的布局。它将解析xml及其属性,然后将其提供给构造函数。
fun Context.defaultAttr(@LayoutRes resource: Int): AttributeSet {
val parser = resources.getLayout(resource)
return Xml.asAttributeSet(parser)
}
用法可能与此类似:
class MyCustomView(
context: Context,
attrs: AttributeSet? = context.defaultAttr(R.layout.view_mycustom),
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
val binding: ViewHabitBinding = ViewMyCustomBinding.inflate(LayoutInflater.from(context), this)
// Your implementation of MyCustom view.
}
我根本没有研究它的性能,但是它基本上可以解析XML并获取属性,所以我认为它不是完全免费的。但是我认为要使视图尽可能清晰和可读是不平衡的。