#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()
вызов, который у вас есть в данный момент, ничего не делают.