【问题标题】:Databinding variable inheritance with included layout包含布局的数据绑定变量继承
【发布时间】:2017-10-25 09:06:58
【问题描述】:

我正在学习数据绑定和 mvvm。我有一个问题,我希望 BaseViewModel.kt 包含一些与 UI 相关的变量,例如 isLoading 标志和 loadingText。当发出网络请求时,我将 isLoading 设置为 true,并且我的基本视图模型的一些子视图应该设置文本。例如,对于LoginViewModel.kt,文本可能是“登录”。是否可以将这些变量传递给包含的基本布局?

所以login_activity.xml 可能会在其布局中包含此内容:

    <data>
        <import type="android.view.View" />
        <variable
            name="viewModel"
            type="core.sdk.ui.login.LoginViewModel" />
    </data>

<!-- Various click listeners using the viewModel variable -->

    <include
        android:id="@+id/progress_include"
        layout="@layout/progress_bar"
        android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}"
        bind:viewModel="@{viewModel}"/>

现在我希望我的 progress_bar.xml 美观且通用,并使用基本视图模型:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="core.sdk.ui.login.LoginActivity">

<data>

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

    <variable
        name="viewModel"
        type="core.sdk.ui.base.BaseViewModel" />

</data>

<LinearLayout
    android:id="@+id/circular_progress"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="vertical">

    <android.support.v4.widget.ContentLoadingProgressBar
        style="@style/Widget.AppCompat.ProgressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/progress_text"
        style="@style/TextAppearance.AppCompat.Subhead"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-thin"
        android:gravity="center_horizontal"
        android:text="@{viewModel.loadingText}"
        android:textStyle="italic"
        tools:text="loading..." />
</LinearLayout>

我得到的错误类似于

****/ data binding error ****msg:Cannot find the setter for attribute 'bind:viewModel' with parameter type core.sdk.ui.login.LoginViewModel

如果这不可能,我能看到的唯一选择是删除包含并将进度条+文本复制并粘贴到每个不太好的视图模型。

【问题讨论】:

    标签: android android-databinding android-include


    【解决方案1】:

    我认为你应该把它放在绑定中:

    <include
        android:id="@+id/progress_include"
        layout="@layout/progress_bar"
        android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}"
        bind:viewModel="@{(core.sdk.ui.base.BaseViewModel)viewModel}"/>
    

    【讨论】:

    • 谢谢,我可以发誓我试过了,但它不喜欢它:)
    【解决方案2】:

    对于那些仍然没有解决方案的人,只需检查您的代码并检查“bind”属性的名称是否与包含的布局中使用的名称相同

    <include
           ...
            bind:viewModel="@{viewModel}"/>
    

    和

    <data>
        ...
        <variable
            name="viewModel"
            type="core.sdk.ui.base.BaseViewModel" />
    
    </data>
    

    【讨论】:

      【解决方案3】:

      您可以将绑定与 include like 结合使用

      loading_view.xml

      <?xml version="1.0" encoding="utf-8"?>
      <layout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          >
      
          <data>
      
              <import type="android.view.View"/>
      
              <variable
                  name="visibility"
                  type="boolean"
                  />
      
              <variable
                  name="text"
                  type="String"
                  />
          </data>
      
          <LinearLayout
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:background="#ff0"
              android:gravity="center_horizontal"
              android:orientation="vertical"
              android:visibility="@{visibility?View.VISIBLE:View.GONE}"
              >
              <ProgressBar
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  />
              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="match_parent"
                  android:text="@{text}"
                  tools:text="AA"
                  />
          </LinearLayout>
      </layout>
      

      使用

      <include
              layout="@layout/loading_view"
              app:visibility="@{viewModel.loadingCondition}"
              app:text='@{"AA"}'
              />
      

      你也可以像这样传递硬值

      app:visibility="@{false}"
      app:text="@{@string/loading_text}"
      

      【讨论】:

      • 我希望我也可以将此标记为答案,这非常有用,谢谢!
      • 我已经这样做了,但文本只是一个空字符串(不显示),没有任何值,无论我放什么。我已经离开了可见性部分,所以我知道不是那样的。帮忙?
      • @Elliptica,默认可见性为false,如果要显示,需要修改为true
      • 在您的示例中,是的,但在我的示例中,默认值为 true。我没有将可见性设置为 false。更重要的是,我在我的 TextView 上放了一个背景,这样我就可以看到视图正在渲染,它只是空的(没有文本)。
      猜你喜欢
      • 2016-03-21
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 2021-12-16
      • 2016-09-13
      • 2012-07-13
      相关资源
      最近更新 更多