问题描述
我有一个自定义视图,该视图继承了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 (将#修改为@)