Составной пользовательский вид игнорирует темы для своих частей - PullRequest
0 голосов
/ 12 марта 2019

У меня есть составное настраиваемое представление, которое содержит несколько представлений внутри.

Это выглядит так:

<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, с разными темами внутри.Но это не работает.

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...