#android #android-layout #android-view
#Android #android-layout #android-просмотр
Вопрос:
Мне нравится, чтобы поле было установлено в TextView на основе условия. Я объявил значения в файле dimens, которые необходимо установить на основе условия.
<dimen name="tall">15dp</dimen>
<dimen name="short">5dp</dimen>
В представлении xml я пытаюсь установить поле
<TextView
android:id="@ id/personal_bio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="@{isTall ? @dimen/tall:@dimen/short}"
android:singleLine="true"
android:text="@{viewmodel.personalBio}"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
Но при компиляции это выдает ошибку, например Cannot find a setter for <android.widget.TextView android:layout_marginTop> that accepts parameter type 'float'
Аналогичное условие отлично работает для других свойств, таких как видимость, цвет и другие, но не смогло заставить его работать для установки поля.
Есть ли какой-либо обходной путь для достижения этого в самом xml?
Комментарии:
1. в этом случае вы можете создать для этого пользовательскую привязку, в которой вы устанавливаете динамическое значение поля
Ответ №1:
попробуйте использовать пользовательскую привязку
class CustomBindings {
companion object {
@BindingAdapter("setTopMargin")
@JvmStatic
fun setTopMargin(view: View, isTall : Boolean){
getTopMargin(view as TextView,isTall )
}
private fun getTopMargin(textView: TextView, isTall : Boolean) {
if(isTall){
val typedValue = TypedValue()
textView.context.resources.getValue(R.dimen.tall, typedValue, true)
val tall= typedValue.float.toInt()
val param = textView.layoutParams as ViewGroup.MarginLayoutParams
param.setMargins(0, tall, 0, 0)
textView.layoutParams = param
}else{
val typedValue = TypedValue()
textView.context.resources.getValue(R.dimen.small, typedValue, true)
val small= typedValue.float.toInt()
val param = textView.layoutParams as ViewGroup.MarginLayoutParams
param.setMargins(0, small, 0, 0)
textView.layoutParams = param}
}
}
}
}
в xml
<TextView
android:id="@ id/personal_bio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
setTopMargin="@{isTall}"
android:singleLine="true"
android:text="@{viewmodel.personalBio}"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
Комментарии:
1. Спасибо за решение. Но значение tall / small всегда равно 0. Следовательно, это не оказывает никакого влияния на макет.