【问题标题】:Android layout databinding won't workAndroid 布局数据绑定不起作用
【发布时间】:2017-04-20 07:30:10
【问题描述】:

我尝试在我的视图中动态隐藏/显示一个元素,因此我遵循了这个示例Dynamically toggle visibility of layout elements with Android data-binding.

我用

  • Android Studio 2.3.1
  • 编译SdkVersion 23
  • buildToolsVersion '25.0.2'
  • minSdkVersion 15
  • targetSdkVersion 17

我的第一个问题是错误消息“属性缺少 Android 命名空间”,但我能找到的所有示例都没有提供命名空间

尽管如此,我还是尝试启动我的项目并得到另一个错误:

android:visibility="@{@bool/list_show_icon ? View.VISIBLE : View.GONE}"

Error:(22, 29) No resource found that matches the given name (at 'visibility' with value '@{@bool/list_show_icon ? View.VISIBLE : View.GONE}').

他似乎没有尝试评估表达式

【问题讨论】:

    标签: android android-databinding


    【解决方案1】:

    layout 标签内添加你的根LinearLayout

    <layout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:app="http://schemas.android.com/apk/res-auto">
    
      <data>
         <import type="android.view.View"/>
      </data>
      <LinearLayout>
      </LinearLayout>
    </layout>
    

    【讨论】:

      【解决方案2】:

      使用DataBinding的第一条规则是你的XML的根元素必须是&lt;layout&gt;

      &lt;layout&gt; 的一部分,而不是其他布局。你的情况应该是

      <layout>
          <data> </data>
          <LinearLayout>
      
          </LinearLayout>
      </layout>
      

      【讨论】:

        【解决方案3】:

        正如 Kishore 已经写的那样。

        必须是根元素并包装整个布局 + 数据。

        它的

        <layout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                xmlns:app="http://schemas.android.com/apk/res-auto">
          <data>
              <import type="android.view.View" />
          </data>
         <LinearLayout  
               android:layout_width="match_parent" 
               android:layout_height="match_parent"
               android:background="?android:attr/activatedBackgroundIndicator"
               android:minHeight="56dp"
               android:orientation="horizontal"
               android:paddding="8dp">
          </LinearLayout>
        </layout>
        

        无论如何,如果您使用数据绑定,我建议使用可观察的布尔值/整数,而不是在布局中使用可见性逻辑。这可以使用 ViewModel 来解决,例如

         <data>
             <variable name="viewModel" type="YourViewModelClass" />
         </data>
        
         <LinearLayout> ... <TextView android:visibility="@{viewModel.isVisible}" />
         </LinearLayout>
        

        并在您的 ViewModel (mvvm) 中使用:

         private boolean ObservableInt isVisible = new ObservableInt(View.GONE);
         private void changeVisibility(boolean visible) { isVisible.set( visible ? View.VISIBLE : View.Gone); }
        

        它只是更清洁,但不影响性能或其他任何东西。

        【讨论】:

          猜你喜欢
          • 2017-08-27
          • 2018-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-21
          • 2017-08-28
          • 1970-01-01
          • 2021-02-22
          相关资源
          最近更新 更多