android - 将 LiveData 作为 <layout> 标签参数传递

标签 android layout android-databinding android-livedata

我有一个关于我的代码的快速问题。我正在编写一个使用 Android MVVM 和 LiveData 的应用程序。我想创建将包含在许多 View 中的加载布局。主要目标是能够传递实时数据,表示布局是否应该可见以及应该使用进度条显示哪些文本信息。

到目前为止,我创建了加载指示器布局,并定义了两个变量“indicatorVisibility”和“progressText”。在附加的代码中,其中一个值被注释掉了。我还创建了 BindingAdapters 来设置控件的可见性和文本。

这是我的进度条布局

<data>

    <variable
        name="indicatorVisibility"
        type="android.arch.lifecycle.LiveData"/>
    <!--<variable-->
        <!--name="progressText"-->
        <!--type="android.arch.lifecycle.LiveData"/>-->
</data>


<android.support.constraint.ConstraintLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/layout_loading_background"
    >

    <ProgressBar
        android:id="@+id/progressBar2"
        style="?android:attr/progressBarStyle"
        android:layout_width="@dimen/layout_loading_progress_bar_size"
        android:layout_height="@dimen/layout_loading_progress_bar_size"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/textView7"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <!--android:text="@{progressText}"-->

    <TextView
        android:id="@+id/textView7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="TextView"
        android:textColor="@color/layout_loading_text"
        android:textSize="@dimen/layout_loading_text_size"
        app:layout_constraintBottom_toBottomOf="@+id/progressBar2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/progressBar2"
        app:layout_constraintTop_toTopOf="@+id/progressBar2" />
</android.support.constraint.ConstraintLayout>

这就是我将它包含在 fragment 布局中的方式

<include layout="@layout/layout_loading_info"
            app:indicatorVisibility="@{viewModel.isBusy}"
            />

那些是我的绑定(bind)适配器:

@BindingAdapter("android:visibility")
fun getVisibility(view: View, liveData: LiveData<Boolean>){
        liveData.observe(view.getLifecycleOwner(), Observer {
        view.visibility = if(it == true) View.VISIBLE else View.INVISIBLE
    })
}

@BindingAdapter("app:text")
fun getText(view: TextView, liveData : LiveData<Int>)
{
    liveData.observe(view.getLifecycleOwner(), Observer {
         it?.let{
            view.text = view.context.resources.getString(it)
        }
    })
}

到目前为止,我尝试传递像 Integer 这样的简单类型并且它有效。问题出在 LiveData 上。即使我不在包含的布局中使用变量,我也会收到错误消息(错误消息什么也没说)。

我在 [此处] 看到了类似的堆栈任务:Applying databinding adapter to include tag但是他们传递了整个 viewModel,这对我来说不是一个足够灵活的解决方案。

最佳答案

我认为您使用了错误的 namespace ;对于数据绑定(bind),应该是 bind :

<include
    layout="@layout/layout_loading_info"
    bind:indicatorVisibility="@{viewModel.isBusy}"/>

数据类型是LiveData<Boolean> ;因此你需要导入 LiveDataBoolean , 为了在 variable 中使用它们定义。数据绑定(bind)应该看起来像这样:

<data class=".databinding.LiveDataBinding">
    <import type="android.arch.lifecycle.LiveData"/>
    <import type="java.lang.Boolean"/>
    <variable name="indicatorVisibility" type="LiveData&lt;Boolean&gt;"/>
</data>

bind:viewModel="@{viewModel}"通常可能比绑定(bind)单个值更好。

关于android - 将 LiveData 作为 <layout> 标签参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54088697/

相关文章:

java - 如何在 Android 中以编程方式 ping 网站

android - 错误 : data binding error msg:No class attribute for 'view' node

Android登录屏幕: Two-way binding EditText and TextView

html - 设置div的高度占据内容布局

javascript - "Floating"带有 HTML/CSS/JavaScript/whatever 的注释

Android DataBinding 3.0.1 对可观察变量的调用方法导致生成导致 NPE 的错误代码

java - Android 函数没有被调用

android - OAuth 生成签名

android - 删除 Eclipse 图形布局中的 Android 状态栏

javascript - HTML 中的水平布局