如何通过Kotlin中的数据绑定设置Android复合视图的可见性?

时间:2018-08-22 04:57:19

标签: android kotlin android-databinding

我检查了许多答案以查找问题,但未成功。我有一个活动,其中包含一个可绘制的复合图像。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <com.my.profile.widgets.ProfileWidget
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    ....
    </LinearLayout>
</layout>

这是我的ProfileWidget:

  class ProfileWidget @JvmOverloads constructor(context: Context,
                                                  attrs: AttributeSet? = null,
                                                  defStyleAttr: Int = 0
    ) : LinearLayout(context, attrs, defStyleAttr) {

        @Inject lateinit var viewModel: ProfileWidgetViewData
        @Inject lateinit var viewActions: ProfileWidgetActions

        private val binding: WidgetProfileBinding = DataBindingUtil.inflate(
                LayoutInflater.from(context), R.layout.widget_profile, this, true)
    //    private val binding = WidgetProfileBinding.inflate(LayoutInflater.from(context), this, true)

        override fun onAttachedToWindow() {
            super.onAttachedToWindow()
            setupDependencyInjection()
            setupDataBinding()

            viewActions.testUI()
        }

        private fun setupDependencyInjection() {
            (context as ProfileActivity).getProfileComponent()?.inject(this)
        }

        private fun setupDataBinding() {
            binding.viewModel = viewModel
        }
    }

这是它的布局:

 <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">

        <data>
            <import type="android.view.View" />

            <variable
                name="viewModel"
                type="com.my.profile.widgets.ProfileWidgetViewData" />
        </data>

        <LinearLayout
            android:id="@+id/profilesContainer"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:background="#FF0000"
            >

            <TextView
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:text="profile 1"
                android:visibility="@{viewModel.textView_1.get() ? View.VISIBLE : View.INVISIBLE}"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:text="profile 2"
                android:visibility="@{viewModel.textView_2.get() ? View.VISIBLE : View.INVISIBLE}"/>

        </LinearLayout>

    </layout>

最后,我的ViewModel类应该制作TextViews  可见/不可见。

 interface ProfileWidgetViewData {
        val textView_1: ObservableBoolean
        val textView_2: ObservableBoolean
    }

    interface ProfileWidgetActions {
        fun testUI()
    }

    class ProfileWidgetViewModelImpl : ProfileWidgetViewData, ProfileWidgetActions {

        override val textView_1 = ObservableBoolean(false)
        override val textView_2 = ObservableBoolean(false)

        override fun testUI() {
            setProfilesContainerVisibility(true)
            setAddProfileContainerVisibility(true)
        }

        private fun setProfilesContainerVisibility(isVisible: Boolean) {
            textView_1.set(isVisible)
        }

        private fun setAddProfileContainerVisibility(isVisible: Boolean) {
            textView_2.set(isVisible)
        }
    }

不幸的是,我在上述代码中没有发现任何错误。当我发射 在应用程序中,尽管我已将它们设置为可见,但是这两个TextView都是不可见的。

1 个答案:

答案 0 :(得分:0)

在build.gradle中添加了以下内容(显然您已经添加了)

    apply plugin: 'kotlin-kapt'

    android {
        dataBinding {
            enabled = true
        }     
    }
    dependencies {
       kapt "com.android.databinding:compiler:3.1.3"
    }

并在xml文件的行下方添加可见性或不可见

 <TextView
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:text="profile 1"
        android:visibility="@{safeUnbox(viewModel.textView_1) ? View.VISIBLE : View.INVISIBLE}"/>