У меня есть составное настраиваемое представление, которое содержит несколько представлений внутри.
Это выглядит так:
<CustomView>
TextView1
TextView2
</CustomView>
Я хочу сделать его полностью настраиваемым, поскольку его следует использовать в несколькихразличные проекты с разным дизайном в качестве библиотеки для них.
Что я сделал:
Я объявил styleable:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="InputViewTheme" format="reference"/>
<declare-styleable name="InputView">
<attr name="titleTheme" format="reference" />
<attr name="titleDescriptionTheme" format="reference" />
</declare-styleable>
</resources>
Затем я написал стили:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="InputTextBold" parent="android:style/Widget.TextView">
<item name="android:fontFamily">@font/my_bold</item>
</style>
<style name="InputTitleStyle" parent="InputTextBold">
<item name="android:textSize">16sp</item>
<item name="android:textColor">#000000</item>
</style>
<style name="InputTitleDescriptionStyle" parent="InputTextBold">
<item name="android:textSize">13sp</item>
<item name="android:textColor">#000000</item>
</style>
<style name="InputViewThemeImpl">
<item name="titleTheme">@style/InputTitleStyle</item>
<item name="titleDescriptionTheme">@style/InputTitleDescriptionStyle</item>
</style>
</resources>
CustomView xml:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rootLayout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
style="?titleTheme"
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
style="?titleDescriptionTheme"
android:id="@+id/titleDescription"
android:layout_marginTop="4dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Код CustomView:
class InputView: LinearLayout {
val titleTextView: TextView
val titleDescriptionTextView: TextView
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs, R.attr.InputViewTheme) {
initialize(attrs)
}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, R.attr.InputViewTheme) {
initialize(attrs)
}
init {
LayoutInflater.from(context).inflate(R.layout.input_view, this, true)
titleTextView = findViewById(R.id.title)
titleDescriptionTextView = findViewById(R.id.titleDescription)
}
private fun initialize(attrs: AttributeSet?) {
val a = context.obtainStyledAttributes(attrs, R.styleable.InputView)
//it is still empty
a.recycle()
}
}
Я объявил тему пользовательского представления в styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="InputViewTheme">@style/InputViewThemeImpl</item>
</style>
И вот как я звонюэто в activity.xml
<app.deadmc.design.InputView
style="@style/InputViewThemeImpl"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
Так что для упрощения я хочу создать тему для представления, которая содержит 2 темы для каждого представления в моем пользовательском представлении.В моем случае это просто 2 TextViews.Поэтому, если я хочу использовать другую тему, я просто создаю другую тему, например InputViewThemeImpl, с разными темами внутри.Но это не работает.
Что я делаю не так?