内部类的Android数据绑定不更新TextView [英] Android databinding on inner class not updating 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屋!