将 LiveData 作为 <layout> 标签参数传递
Passing LiveData as <layout> tag argument
我有关于我的代码的快速问题。我正在使用 Android MVVM 和 LiveData 编写一个应用程序。我想创建将包含在许多视图中的加载布局。主要目标是能够传递实时数据,表示布局是否应该可见以及应该使用进度条显示哪些文本信息。
到目前为止,我创建了加载指示器布局,并定义了两个变量 "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>
这就是我将其包含在片段布局中的方式
<include layout="@layout/layout_loading_info"
app:indicatorVisibility="@{viewModel.isBusy}"
/>
那些是我的绑定适配器:
@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,这对我来说不是一个足够灵活的解决方案。
我想你用错名字了-space;对于数据绑定,应该是 bind
:
<include
layout="@layout/layout_loading_info"
bind:indicatorVisibility="@{viewModel.isBusy}"/>
数据类型为LiveData<Boolean>
;因此您需要导入 LiveData
和 Boolean
,以便在 variable
定义中使用它们。数据绑定应该看起来像这样:
<data class=".databinding.LiveDataBinding">
<import type="android.arch.lifecycle.LiveData"/>
<import type="java.lang.Boolean"/>
<variable name="indicatorVisibility" type="LiveData<Boolean>"/>
</data>
bind:viewModel="@{viewModel}"
通常可能比绑定单个值更好。
我有关于我的代码的快速问题。我正在使用 Android MVVM 和 LiveData 编写一个应用程序。我想创建将包含在许多视图中的加载布局。主要目标是能够传递实时数据,表示布局是否应该可见以及应该使用进度条显示哪些文本信息。
到目前为止,我创建了加载指示器布局,并定义了两个变量 "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>
这就是我将其包含在片段布局中的方式
<include layout="@layout/layout_loading_info"
app:indicatorVisibility="@{viewModel.isBusy}"
/>
那些是我的绑定适配器:
@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,这对我来说不是一个足够灵活的解决方案。
我想你用错名字了-space;对于数据绑定,应该是 bind
:
<include
layout="@layout/layout_loading_info"
bind:indicatorVisibility="@{viewModel.isBusy}"/>
数据类型为LiveData<Boolean>
;因此您需要导入 LiveData
和 Boolean
,以便在 variable
定义中使用它们。数据绑定应该看起来像这样:
<data class=".databinding.LiveDataBinding">
<import type="android.arch.lifecycle.LiveData"/>
<import type="java.lang.Boolean"/>
<variable name="indicatorVisibility" type="LiveData<Boolean>"/>
</data>
bind:viewModel="@{viewModel}"
通常可能比绑定单个值更好。