【问题标题】:databinding in android kotlin in the same viewandroid kotlin 中的数据绑定在同一个视图中
【发布时间】:2018-12-31 11:55:46
【问题描述】:

我有一个复选框和文本视图,我想根据复选框的 isChecked 设置文本视图的可见性,可以直接使用 xml 文件中的数据绑定来完成吗?

编辑

class SquareCheckBox @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = 0) : ConstraintLayout (context, attrs, defStyle){

    private var layout: ConstraintLayout
    private var checkImageView : ImageView
    private var iconImageView : ImageView
    private var titleTextView : TextView

    var isChecked : Boolean  = (false)
    var iconImage : Int = -1
    var title : String = ""

    init {

        val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        val view = inflater.inflate(R.layout.item_square_checkbox, this, true)

        layout = view.layout
        checkImageView = view.checkImageView
        iconImageView = view.iconImageView
        titleTextView = view.titleTextView

        initAttributes(attrs)
        applyUIChanges()
    }

    fun initAttributes(attrs: AttributeSet?){

        attrs?.let {
            val typedArray = context.obtainStyledAttributes(it, R.styleable.square_checkbox_attributes, 0, 0)
            isChecked = typedArray.getBoolean(R.styleable.square_checkbox_attributes_isChecked, false)
            iconImage = typedArray.getResourceId(R.styleable.square_checkbox_attributes_iconImage, -1)
            title = typedArray.getString(R.styleable.square_checkbox_attributes_title)

            typedArray.recycle()
        }
    }

    fun applyUIChanges () {

        if (isChecked) {
            checkImageView.visibility = View.VISIBLE
            titleTextView.setTextColor(resources.getColor(android.R.color.black))
            layout.setBackgroundResource(R.drawable.xml_square_checkbox_selected)
        } else {
            checkImageView.visibility = View.INVISIBLE
            titleTextView.setTextColor(resources.getColor(R.color.lightGray))
            layout.setBackgroundResource(R.drawable.xml_square_checkbox_unselected)
        }

        if (iconImage != -1) {
            iconImageView.setImageResource(iconImage)
        }

        titleTextView.setText(title)
    }

    fun performOnClick () {
        isChecked = !isChecked
        applyUIChanges()
    }

    companion object {

        @JvmStatic
        @BindingAdapter("app:isChecked")
        fun setIsChecked(view: SquareCheckBox, checked: Boolean) {

            view.isChecked = checked
            view.applyUIChanges()
        }

        @InverseBindingAdapter(attribute = "app:isChecked")
        @JvmStatic fun getIsChecked(view: SquareCheckBox) : Boolean {
            return view.isChecked
        }

        @BindingAdapter("app:isCheckedAttrChanged")
        @JvmStatic fun setListeners(
            view: SquareCheckBox,
            attrChange: InverseBindingListener) {
        }
    }
}

这是xml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:app="http://schemas.android.com/apk/res-auto"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content">

    <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/xml_square_checkbox_unselected">

        <ImageView
                android:id="@+id/checkImageView"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:src="@drawable/ic_ckeck"
                android:tint="@color/colorPrimary"
                android:visibility="visible"
                app:layout_constraintEnd_toEndOf="parent"
                android:layout_marginTop="4dp"
                app:layout_constraintTop_toTopOf="parent"
                android:layout_marginEnd="4dp"
                android:layout_marginRight="4dp"/>

        <ImageView
                android:id="@+id/iconImageView"
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_centerHorizontal="true"
                android:src="@drawable/ic_placeholder_squre" app:layout_constraintTop_toBottomOf="@+id/checkImageView"
                app:layout_constraintBottom_toTopOf="@+id/titleTextView"
                app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp"
                android:layout_marginRight="8dp" app:layout_constraintStart_toStartOf="parent"
                android:layout_marginLeft="8dp" android:layout_marginStart="8dp"/>

        <TextView
                android:id="@+id/titleTextView"
                android:layout_width="90dp"
                android:layout_height="wrap_content"
                android:layout_below="@id/iconImageView"
                android:ellipsize="end"
                android:gravity="center"
                android:lines="2"
                android:text="@string/text"
                android:maxLines="2"
                android:textColor="@android:color/black"
                android:textSize="12sp"
                android:layout_marginBottom="4dp"
                android:layout_marginStart="4dp"
                android:layout_marginEnd="4dp"
                android:layout_marginRight="4dp"
                android:layout_marginTop="8dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/iconImageView"
                app:layout_constraintEnd_toEndOf="parent"
                />

    </androidx.constraintlayout.widget.ConstraintLayout>
</merge>

EDIT2

我还在视图模型中添加了一个变量,并尝试根据它设置可见性

<com.google.android.material.textfield.TextInputLayout
                android:visibility="@{viewModel.doNotDisturbEnabled ? View.GONE : View.VISIBLE}"
                android:id="@+id/from_textinput"
                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="8dp"
                android:fontFamily="sans-serif"
                android:hint="@string/from"
                android:textColor="@color/colorDarkGrey"
                android:textColorHint="@color/colorDarkGrey"
                android:textSize="12sp"
                android:textStyle="normal"
                app:boxCornerRadiusBottomEnd="5dp"
                app:boxCornerRadiusBottomStart="5dp"
                app:boxCornerRadiusTopEnd="5dp"
                app:boxCornerRadiusTopStart="5dp"
                app:boxStrokeColor="@color/colorPrimary"
                app:boxStrokeWidth="3dp"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/doNotDisturbCheckBox"
                app:layout_constraintHorizontal_bias="0.5"
                app:layout_constraintEnd_toStartOf="@+id/to_textinput">

            <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/from_textedit"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"/>

        </com.google.android.material.textfield.TextInputLayout>

但是还是不行

【问题讨论】:

  • 你有哪个视图你使用 RecyclerView / Listview
  • 我有一个将在 RecycleView 中使用的自定义视图
  • 你能提供你的xml文件吗?

标签: android data-binding kotlin


【解决方案1】:

是的,您可以使用数据绑定来执行此操作,因为您需要 DataBinding Obserable 并为您的模型创建自己的 @Binder,并在复选框状态的状态更改时更改此观察到的属性的值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2016-06-05
    相关资源
    最近更新 更多