Last time, I introduced Try to display static text using DataBinding. This time, I will modify this a little and implement an application that switches the text when the button is clicked.
SampleEventHandlers.java
public interface SampleEventHandlers {
void onChangeClick(View view);
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Binding Objects -->
<data>
<variable name="user" type="com.example.databinding2.User" />
<!--Named handlers(Any)The handler (interface) is set with-->
<variable name="handlers" type="com.example.databinding2.SampleEventHandlers" />
</data>
<!-- View -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.email}" />
<Button android:id="@+id/button_change"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Change"
android:onClick="@{handlers.onChangeClick}" />
<!--Buttons and SampleEventHandlers.Link onChangeClick of java-->
</LinearLayout>
</layout>
User.java
public class User {
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
public String getName() { return name; }
public String getEmail() { return email; }
//Add setter
public void setName(String name) {
this.name = name;
}
//Add setter
public void setEmail(String email) {
this.email = email;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity implements SampleEventHandlers{
private User user = new User("Taro", "[email protected]");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Get an instance of Binding
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//Associate xml user with MainActivity user
binding.setUser(user);
//OnChangeClick of MainActivity in handlers of xml()Link
binding.setHandlers(this);
}
//Event handling when button is clicked
@Override
public void onChangeClick(View view) {
if (user.getName().equals("Taro")) {
user.setName("Jiro");
user.setEmail("[email protected]");
Log.d("DEBUG", user.getName());
} else {
user.setName("Taro");
user.setEmail("[email protected]");
}
}
}
When I do this, the log shows "Jiro", but the characters that appear on the screen remain "Taro". why?
Apparently, it seems that a mechanism to notify View of property changes is necessary, and it is necessary to modify the User model so that objects can be monitored.
Point
User.java
public class User extends BaseObservable {
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
@Bindable
public String getName() { return name; }
@Bindable
public String getEmail() { return email; }
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
public void setEmail(String email) {
this.email = email;
notifyPropertyChanged(BR.email);
}
}
https://qiita.com/Omoti/items/a83910a990e64f4dbdf1#step0-%E5%B0%8E%E5%85%A5 Thank you very much