内部类的Android数据绑定不更新TextView [英] Android databinding on inner class not updating TextView

查看:106
本文介绍了内部类的Android数据绑定不更新TextView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

应用程序运行,但 TextView 未获得更新此处是相关代码。

App runs but the TextView doesn't get update here is the relevant code.

activity_picker_dashboard.xml

activity_picker_dashboard.xml

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Top header -->

    <include layout="@layout/layout_header" /> This layout has databinding

    <!-- DrawerLayout -->

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@color/gray"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar">
.....

这是layout_header.xml

Here is layout_header.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="profilePayload"
            type="myms.models.ProfileResponse.Payload"/>
    </data>

<Toolbar
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:padding="8dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white">

<android.support.constraint.ConstraintLayout
    android:id="@+id/header"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <ImageView
        android:layout_width="180dp"
        android:layout_height="60dp"
        android:adjustViewBounds="true"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:src="@drawable/logo_color"/>

    <TextView
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:text="@{profilePayload.firstName}" Here it is
        android:textColor="@color/red"
        android:textSize="18sp"
        app:layout_constraintBottom_toTopOf="@+id/role"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_chainStyle="packed" />

...............
</Toolbar>
</layout>

这是我的模型ProfileResponse.java

Here is my model ProfileResponse.java

public class ProfileResponse
{
    public Payload getPayLoad() {
        return payLoad;
    }

    @SerializedName("Payload")
    private Payload payLoad;

    public static class Payload
    {
        public String getProfileId() {
            return profileId;
        }

        public String getUserId() {
            return userId;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        @SerializedName("ProfileId")
        private String profileId;

        @SerializedName("UserId")
        private String userId;

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        @SerializedName("FirstName")

        private String firstName;

        @SerializedName("LastName")
        private String lastName;
    }
}

最后这是我的活动

 public class PickerDashboardActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_picker_dashboard);

        LayoutHeaderBinding binding = LayoutHeaderBinding.inflate(getLayoutInflater());

        ProfileResponse.Payload profilePayload = new ProfileResponse.Payload();
        profilePayload.setFirstName("Test");

        binding.setProfilePayload(profilePayload);

        ButterKnife.bind(this);
}

请提供解决方案。我已经尝试了很长一段时间了。
PS:我也在用黄油刀。

Please suggest a solution. I have been trying this for quite some time now. P.S: I'm also using butter knife.

推荐答案

问题在于如何混合数据绑定具有常规布局的布局。

The problem is in how you're mixing data binding layouts with regular layouts.

如果要从常规布局中包含数据绑定布局,则需要找到布局的根视图并调用 bind()就可以了。也许是这样的:

If you want to include a data binding layout from a regular layout, you need to find the root view of the layout and call bind() on it. Maybe something like this:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_picker_dashboard);
    View bindingRoot = findViewById(R.id.toolbar);

    LayoutHeaderBinding binding = LayoutHeaderBinding.bind(bindingRoot);

    ProfileResponse.Payload profilePayload = new ProfileResponse.Payload();
    profilePayload.setFirstName("Test");

    binding.setProfilePayload(profilePayload);
}

但是,最好让Activity的布局成为数据绑定布局不需要做额外的工作:

However, it is better to make your Activity's layout a data binding layout and you won't have to do that extra work:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="profilePayload"
            type="myms.models.ProfileResponse.Payload"/>
    </data>
    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- Top header -->

        <include layout="@layout/layout_header" app:profilePayload="@{profilePayload}" />

        <!-- DrawerLayout -->
    </android.support.constraint.ConstraintLayout>
</layout>

然后你的绑定代码更简单,更不容易出错:

And then your binding code is much simpler and less error prone:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActivityPickerDashboardBinding binding = 
        DataBindingUtil.setContentView(this, R.layout.activity_picker_dashboard);

    ProfileResponse.Payload profilePayload = new ProfileResponse.Payload();
    profilePayload.setFirstName("Test");

    binding.setProfilePayload(profilePayload);
}

另一方面,我认为Android数据绑定和butterknife在功能,我建议选择其中一个,但不是两个。

On a different note, I think Android data binding and butterknife have significant overlap in functionality and I would recommend choosing one or the other, but not both.

这篇关于内部类的Android数据绑定不更新TextView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆