如何将样式应用于自定义视图父级

问题描述

我有一个自定义视图,该视图继承了LinearLayout。我想使用合并标记来避免嵌套两个LinearLayouts。但是,parentTag只能用于在编辑器中应用属性

我了解到您可以通过创建样式属性来应用样式,您可以将其应用于主题

它看起来像这样:

布局:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:gravity="center_vertical"
    tools:ignore="UseCompoundDrawables"
    tools:layout_height="@dimen/listSingleItemHeight"
    tools:layout_marginEnd="@dimen/screenMargin"
    tools:layout_marginStart="@dimen/screenMargin"
    tools:layout_width="match_parent"
    tools:orientation="horizontal"
    tools:parentTag="android.widget.LinearLayout">

    <ImageView
        android:id="@+id/ivSingleLine"
        android:layout_width="@dimen/iconSize"
        android:layout_height="@dimen/iconSize"
        android:layout_gravity="center_vertical"
        android:contentDescription="@null"
        tools:srcCompat="@drawable/ic_commit" />

    <TextView
        android:id="@+id/lblSingleLine"
        style="@style/Text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginTop="0dp"
        android:gravity="center_vertical"
        tools:text="@string/charges" />
</merge>

视图类:

class SingleLineView @JvmOverloads constructor(
        context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = R.attr.singleLinestyle
) : LinearLayout(context,attrs,defStyleAttr) {

    init {
        View.inflate(context,R.layout.view_single_line,this)
        obtainStyleAttributes(context,defStyleAttr)
    }

    private fun obtainStyleAttributes(context: Context,attrs: AttributeSet?,defStyleAttr: Int) {
        context.theme.obtainStyledAttributes(attrs,R.styleable.SingleLineView,defStyleAttr,0).apply {
            ivSingleLine.setimageResource(getResourceId(R.styleable.SingleLineView_imageViewSrc,0))
            val contentDescription = getString(R.styleable.SingleLineView_imageViewContentDescription)
            contentDescription?.let { ivSingleLine.contentDescription = it }
            lblSingleLine.text = getString(R.styleable.SingleLineView_text)
            val textSize = getDimensionPixelSize(R.styleable.SingleLineView_textSize,0)
            if (textSize > 0) lblSingleLine.setTextSize(COMPLEX_UNIT_PX,textSize.toFloat())
        }.recycle()
    }
}

属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="singleLinestyle" format="reference" />
    <declare-styleable name="SingleLineView">
        <attr name="imageViewSrc" format="reference" />
        <attr name="imageViewContentDescription" format="string" />
        <attr name="textSize" format="dimension" />
        <attr name="text" format="string" />
    </declare-styleable>
</resources>

主题和样式:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
   ...
   <item name="singleLinestyle">@style/SingleLine</item>
        
</style>

<style name="SingleLine">
    <item name="android:gravity">center_vertical</item>
    <item name="android:height">@dimen/listSingleItemHeight</item>
    <item name="android:layout_marginStart">@dimen/screenMargin</item>
    <item name="android:layout_marginEnd">@dimen/screenMargin</item>
    <item name="android:orientation">horizontal</item>
</style>

这是我的用法(我知道它会导致一些嵌套,但是我在某些地方有很多静态布局):

...
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

...

    <com.babestudios.companyinfouk.core.views.SingleLineView
        android:id="@+id/llCompanyFilings"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:focusable="true"
        app:imageViewContentDescription="@string/filing_history"
        app:imageViewSrc="@drawable/ic_company_filing_history"
        app:text="@string/filing_history" />

...

/>

...

现在,将defStyleAttr添加到对LinearLayout父对象的调用中,但是它没有任何作用。我的视图没有在SingleLine样式中添加边距或高度。我在做什么错了?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)