当前位置: 首页 > 面试题库 >

内部类上的Android数据绑定未更新TextView

彭烨烁
2023-03-14
问题内容

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

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

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

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:我也在用黄油刀。


问题答案:

问题在于如何将数据绑定布局与常规布局混合在一起。

如果要包括常规布局中的数据绑定布局,则需要找到该布局的根视图并对其进行调用bind()。也许是这样的:

@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);
}

但是,最好将“活动”的布局设置为数据绑定布局,而不必进行额外的工作:

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

然后,您的绑定代码更加简单,并且不易出错:

@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数据绑定和黄油刀在功能上有很大的重叠,我建议您选择其中之一,但不要同时选择两者。



 类似资料:
  • 问题内容: 我们正在尝试在Spring 3.2中实现特殊的部分更新功能。我们使用Spring作为后端,并且有一个简单的Javascript前端。我无法找到满足我们要求的简单解决方案,即 update()函数应采用任意数量的field:values并相应地更新持久性模型。 我们对所有字段进行了内联编辑,因此,当用户编辑字段并进行确认时,会将id和修改后的字段作为json传递给控制器​​。控制器应该能

  • 我们正在尝试在Spring 3.2中实现一个特殊的部分更新功能。我们使用Spring作为后端,并有一个简单的Javascript前端。我无法找到一个直截了当的解决方案来满足我们的要求,即update()函数应该接受任意数量的字段:值并相应地更新持久性模型。 我们对所有字段都进行了在线编辑,因此当用户编辑字段并确认时,id和修改后的字段将作为json传递给控制器。控制器应该能够从客户端接收任意数量的

  • 我想知道以下内容之间有什么区别: 与 有任何性能差异吗? 每个的首选用例是什么? 任何其他信息都将不胜感激! 谢谢!

  • 我正在项目中使用数据绑定,但在xml绑定类中使用和时未生成。 例如,我有activity_main.xml Android Studio:2.1.3 类路径:com.Android.tools.build:Gradle:2.1.3 minSdkVersion 16 targetSdkVersion 24 buildToolsVersion 24.0.0

  • HTML部分,我想在两个位置激活移动部分 点击切换类时调用的JS函数 布尔值在点击时更新,但类不...我是不是要重新渲染什么的?

  • 我使用新的数据绑定库在Java编写了以下片段类 它的编译和运行都很好。 我尝试用Kotlin重写它,并得出以下结论: 但现在步骤输出以下内容: 错误:(16,38)未解析引用:DataBinding 错误:(37,27)未解析引用:FragmentDataBinding 我如何使用android-databinding库与Kotlin? 我的顶级: 应用程序目录中的我的(仅相关部分): 我使用的是