【问题标题】:Android data binding and included layout doesn't update visibilityAndroid 数据绑定和包含的布局不会更新可见性
【发布时间】:2017-11-16 11:43:47
【问题描述】:

您好,由于减少了代码重复,我已经用几个 ImageViewTextView 元素制作了布局。 我遇到了两个问题:

  1. 我需要使用数据绑定更新布局内的这些元素,但我不知道如何访问它们以更新图像和文本?
  2. 布局的可见性应该从 VM 对象绑定(默认可见性是 GONE)但它不起作用。即使我更新了 VM setter 以提高可见性,布局仍然在屏幕上可见。

代码:

包含的布局:

<?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>

活动布局(这是一个sn-p,整个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;
    }

如果您需要任何其他代码 sn-p,请告诉我。

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

谢谢,

霍格

【问题讨论】:

  • 能否请您发布这两点的代码?
  • 当然,等一下

标签: android mvvm data-binding android-databinding


【解决方案1】:

如果要使用 DataBinding,请确保将 &lt;layout&gt; 作为 xml 文件的根标记。

您可以拥有&lt;include&gt; 的 id 并通过它访问包含的布局的控件。例如,您的&lt;include&gt; 的 id 为“包含”,那么您可以使用binding.included.detailsbinding.included.favourite 访问它

【讨论】:

  • 我使用 作为根元素,这不是问题。问题是我不知道如何访问包含布局的每个textViewimageView。例如,假设我们需要为其更新 Image 和 Text……我需要使用哪个属性来更改这些视图?也许我没有以正确的方式解释我的问题?
  • 是的,这就是我要告诉你的,通过 id 访问它,就像我在回答 binding.included.details 中解释的那样。确保你包含的布局也应该有&lt;layout&gt; 作为根标签。另请参阅this 回答。
  • 啊哈,谢谢哥们 :) 会试试这个,让你知道结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 2016-12-21
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
相关资源
最近更新 更多