Созданный пользовательский TextView не применяет параметры макета

#android #android-layout #kotlin

#Android #android-макет #kotlin

Вопрос:

У меня есть пользовательский TextView, который помещается внутри LinearLayout

 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools">

    <TextView
        android:id="@ id/timerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:maxLines="2"
        android:ellipsize="end"
        tools:text="Only on 22 of July, 2019"
        android:textColor="@color/white" />
</LinearLayout>
 

И CustomTimerView с некоторой логикой

 class CustomTimerView(context: Context, attributeSet: AttributeSet) : LinearLayout(context, attributeSet) {
    private var textView: TextView

    init {
        LinearLayout.inflate(context, R.layout.customTimer_layout, this)
        textView = findViewById(R.id.timerView)
    }

    fun setDates(ob: Promo) {
        val startDate = getStartDate(ob)
        val endDate = getEndDate(ob)

        if (startDate.get(Calendar.MONTH) != endDate.get(Calendar.MONTH)) {
            textView.text = getInDifferentMonths(context!!, ob)
        } else {
            if (startDate.get(Calendar.DAY_OF_MONTH) == endDate.get(Calendar.DAY_OF_MONTH)) {
                textView.text = getOnlyOneDay(context!!, ob)
            } else {
                textView.text = getInOneMonth(context!!, ob)
            }
        }
    }
}
 

И я хочу удалить LinearLayout, потому что это бесполезно. Но когда я перехожу только к текстовому представлению, например

 <TextView
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
        android:id="@ id/timerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:maxLines="2"
        android:ellipsize="end"
        tools:text="Only on 22 of July, 2019"
        android:textColor="@color/white" />
 

И код класса, как:

 class CustomTimerView(context: Context, attributeSet: AttributeSet) : TextView(context, attributeSet) {

    init {
        TextView.inflate(context, R.layout.custom_timer_layout, null)
    }

    fun setDates(ob: Promo) {
        val startDate = getStartDate(ob)
        val endDate = getEndDate(ob)

        if (startDate.get(Calendar.MONTH) != endDate.get(Calendar.MONTH)) {
            this.text = getInDifferentMonths(context!!, ob)
        } else {
            if (startDate.get(Calendar.DAY_OF_MONTH) == endDate.get(Calendar.DAY_OF_MONTH)) {
                this.text = getOnlyOneDay(context!!, ob)
            } else {
                this.text = getInOneMonth(context!!, ob)
            }
        }
    }
}
 

Я вижу текст, но похоже, что цвет и другие параметры в TextView не работают. Как это исправить?

Комментарии:

1. Если этот макет есть custom_timer_layout , это совершенно бессмысленно и не влияет на ваш CustomTimerView . Вместо этого вы бы установили нужные атрибуты для <com.example.app.CustomTimerView> элементов при использовании в макетах вашего приложения.

2. Да, но у меня есть около 3 вариантов использования этого представления в моем проекте, и размещение его в каждом представлении не является идеальным решением

3. В зависимости от фактического использования вы можете создать отдельный макет, который является просто a <com.example.app.CustomTimerView> с требуемыми настройками атрибутов, и <include> это там, где это необходимо. Или вы можете просто установить эти атрибуты программно в CustomTimerView себе. Или вы можете определить атрибут стиля по умолчанию и стиль по CustomTimerView умолчанию для и т.д. В любом случае этот макет и inflate() вызов, который у вас есть в данный момент, ничего не делают.