Android数据绑定和包含的布局不会更新可见性

时间:2017-06-14 10:55:29

标签: android mvvm data-binding android-databinding

您好我已经使用 ImageView TextView 元素进行了布局,因为减少了代码重复。 我遇到了两个问题:

  1. 我需要使用数据绑定更新布局内的这些元素,但我不知道如何更新图像和文本?
  2. 布局的可见性应该从VM对象绑定(默认可见性为 GONE ),但它不起作用。即使我更新VM setter以获得可见性,也会在屏幕上显示布局。
  3. 代码:

    包含布局:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <LinearLayout
            android:id="@+id/details"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:background="#FF0000">
    
            <ImageView
                android:id="@+id/image_details"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <TextView
                android:id="@+id/text_details"
                android:text="details"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/favorites"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:background="#00FF00">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <TextView
                android:text="details"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/record"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:background="#0000FF">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <TextView
                android:text="details"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/remind_me"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:background="#FF0000">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <TextView
                android:text="details"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/return_to_begin"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:background="#00FF00">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <TextView
                android:text="details"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
        </LinearLayout>
    
    
    </LinearLayout>
    

    活动布局(这是一个片段,整个xml太大了)

    <include layout="@layout/manu_layout"
                android:layout_above="@+id/info"
                android:layout_alignParentRight="true"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:visibility="@{vm.infoMenu}"/>
    

    可见性的viewModel方法:

     public void setInfoMenu() {
            if(menuVisibility == View.VISIBLE){
                menuVisibility = View.GONE;
                setMediaControlView(false);
            }else {
                menuVisibility=View.VISIBLE;
                setMediaControlView(true);
    
            }
            notifyPropertyChanged(BR.infoMenu);
        }
        @Bindable
        public int getInfoMenu(){
            return menuVisibility;
        }
    

    如果您需要任何其他代码段,请与我们联系。

    你能帮我解决一下这些问题吗?

    谢谢,

    Hogar的

1 个答案:

答案 0 :(得分:1)

如果要使用DataBinding,请确保将<layout>作为xml文件的根标记。

您可以通过它获得包含布局的<include>和acceess控件的ID。例如,您的<include>的ID为“已包含”,您可以binding.included.detailsbinding.included.favourite

访问该ID