【问题标题】:Controlling view visibility via databinding通过数据绑定控制视图可见性
【发布时间】:2018-03-23 01:48:24
【问题描述】:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <import type="android.view.View" />
        <variable
            name="notificationResponse"
            type="myms.models.NotificationResponse"/>
    </data>
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

...........
<TextView
        android:id="@+id/tv_empty_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/_12dp"
        android:layout_marginRight="@dimen/_12dp"
        android:minHeight="@dimen/_60dp"
        android:gravity="center"
        android:textSize="@dimen/_18sp"
        android:textStyle="bold"
        android:text="No Message"
        android:background="@color/white"
        android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"/>

......
</FrameLayout>
</layout>

我想要实现的是,默认情况下视图应该是 GONE 并且在我的代码中实际绑定 notificationResponse 对象的异步调用之后,它应该决定是显示还是隐藏视图。

【问题讨论】:

  • 简单的google搜索返回this
  • 请阅读完整的问题。
  • @PrakhaRaM 大声笑,这是一个随机问题,甚至与此无关
  • 将我在此处显示的布尔变量设置为 false,并在您从服务器调用获得响应时将其设置为 true,根据该变量您将决定是否使视图消失或可见。

标签: android android-databinding


【解决方案1】:

你写的代码android:visibility="@{notificationResponse.payloads.size() &gt; 0 ? View.GONE : View.VISIBLE}"的解释是

当您的列表大小包含多个数据时,您想要隐藏 TextView,而在其他情况下您想要显示它。

当您调用 API 时,您的列表大小肯定会小于或等于 0,因此它不会可见。

解决方案:

传递一些表明 API 仍在后台调用的变量,当 API 调用完成后,将该变量设置为 false。

android:visibility="@{notificationResponse.payloads.size() > 0 || !loading ? View.GONE : View.VISIBLE}"

这意味着如果您的列表大小超过一个并且 API 调用完成,TextView 应该隐藏。

loading的默认值应该是false,当你调用API时将该值更改为true,当再次调用API时将其设置为false。

【讨论】:

  • 但是正确的语句应该是android:visibility="@{notificationResponse.payloads.size() &gt; 0 || loading ? View.GONE : View.VISIBLE}",变量应该在数据标签内声明,比如&lt;variable name="loading" type="Boolean"/&gt;
  • and variable should be declared inside data tag 是的,这很明显。 android:visibility="@{notificationResponse.payloads.size() &gt; 0 || loading ? View.GONE : View.VISIBLE}" 谢谢,会更新答案:)
  • 这是给其他任何人看答案的。
【解决方案2】:

在片段/活动中,您可以创建字段 int itemsCount = 0 并在获得响应后设置 itemsCount = response.payloads.size() 并在 xml 中设置 itemCount 而不是 NotificationResponse。

实际上,您必须在绑定中设置新变量才能对视图产生影响。这意味着如果您想在不更改 xml 的情况下获得结果,只需设置新的 List yo 您的变量,然后从响应中获取响应集列表。

【讨论】:

  • 谢谢,听起来很有希望,我需要将我的活动或片段作为数据标签内的变量传递吗?
  • 谢谢,但是这个变量将与 payloads.size() 具有相同的效果,因为最初两者都是 0
  • 但是您的建议非常有价值,我意识到这是正确的方法,而不是传递对象。
【解决方案3】:

编辑

第一种方式(根据下面的cmets)是这样的:

public void setLoading(boolean loading) {
    isLoading = loading;
    notifyPropertyChanged(BR._all);
}

notifyPropertyChanged(BR.loading);

ref

但是,有一种更简单的方法可以做到这一点,我会按照以下方式完成: 首先在您的视图中更改此行

android:visibility="@{notificationResponse.payloads.size() > 0 ? View.GONE : View.VISIBLE}"/>

android:visibility="gone"/>

然后在您的 AsyncTask 中添加如下内容:

protected void onPostExecute(Boolean toBeShown) {
    if(toBeShown){
        tvEmptyView.setVisibility(View.VISIBLE);
    }else{
        tvEmptyView.setVisibility(View.GONE);
    }
}

【讨论】:

  • 通过数据绑定控制视图可见性有什么不明白的地方?我很确定作者知道如何手动执行此操作
  • xD , stackoverflow.com/a/40859353/2724879 这是我很久以前找到的答案,但正如我所说的 I would have done it the following way 我只是给出了不同的方法
  • 这更适合这个问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多