样式属性在合并标记上不起作用

时间:2014-08-30 15:47:35

标签: android android-layout android-view android-xml android-styles

背景

我发现样式属性在 merge 标记上不起作用,可以单独应用属性或应用样式。

已知解决方案

  1. 在使用布局工作的标记上应用样式属性。例如,包含标记和自定义标记。

  2. 只是不要使用合并。

  3. 以编程方式应用样式。

  4. 但是,我正在寻找更好的解决方案。

    为什么吗

    1. 很乱。我每次使用布局时都必须应用样式属性。我把它作为一个单独的布局,因为它们可以重复使用。

    2. 我故意使用 merge 标记,因为它们必须是父布局的直接子项。例如,标签是 LinearLayout 的子项。我应用 layout_width =“0dp” layout_weight =“1”使它们在父布局中同样跨越。

    3. 原因#2 plus 标记以编程方式生成。因此,我只能以编程方式应用样式。这很难看,维护需要额外的努力。

    4. 目标

      令人满意的解决方法。

      用于插图目的的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>
      

      上述两个标签都没有设置样式。

2 个答案:

答案 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并获取属性,所以我认为它不是完全免费的。但是我认为要使视图尽可能清晰和可读是不平衡的。