Как установить поле для представления на основе условия — Android

#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. Следовательно, это не оказывает никакого влияния на макет.