大佬教程收集整理的这篇文章主要介绍了android – 双向数据绑定(在xml中),ObservableField,BaseObservable,我应该用哪个进行双向数据绑定?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
android:text="@={testStr}"
这在官方文档中没有提到(https://developer.android.com/topic/libraries/data-binding/index.html,这个页面通常会更新,现在可能会更改).但它可以将变量绑定到xml.@H_301_3@
这里的例子(https://developer.android.com/topic/libraries/data-binding/index.html#observablefields)@H_301_3@
private static class User { public final ObservableField<String> firstName = new ObservableField<>(); public final ObservableField<String> lastName = new ObservableField<>(); public final Observableint age = new ObservableInt(); }
3.将模型类扩展为BaSEObservable@H_301_3@
private static class User extends BaSEObservable { private String firstName; private String lastName; @Bindable public String getFirstName() { return this.firstName; } @Bindable public String getLastName() { return this.lastName; } public void setFirstName(String firstName) { this.firstName = firstName; notifyPropertyChanged(BR.firstName); } public void setLastName(String lastName) { this.lastName = lastName; notifyPropertyChanged(BR.lastName); } }
模型类必须扩展到BaSEObservable类,并且getter方法必须使用“@Bindable”进行注释,并且setter方法需要使用绑定xml中的相应命名调用方法notifyPropertyChange().@H_301_3@
我的问题是,我想知道三种绑定方法的缺点和优点.当然,我知道第一个会更容易.但是我在文档和某些网站上找到了一些时刻.它在下一刻消失了.官方文档未经任何明确公告而更改.我仍然想知道@R_379_10675@用第一种方法,所以我必须准备改变方法2或3.@H_301_3@
public class student_XML2WAY { private int age; private String name; public int getAge() { return age; } public void setAge(int pAgE) { age = pAge; } public String getName() { return name; } public void setName(String pName) { name = pName; } }
student_ObserField.java@H_301_3@
public class student_ObserField { private Observableint age; private ObservableField<String> name; public student_ObserField() { age = new ObservableInt(); name = new ObservableField<>(); } public ObservableInt getAge() { return age; } public ObservableField<String> getName() { return name; } }
public class student_Extend extends BaSEObservable{ private int age; private String name; @Bindable public int getAge() { return age; } public void setAge(int pAgE) { age = pAge; notifyPropertyChanged(BR.student3); } @Bindable public String getName() { return name; } public void setName(String pName) { name = pName; notifyPropertyChanged(BR.student3); } }
activity_main.xml中@H_301_3@
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://scheR_585_11845@as.android.com/apk/res/android" xmlns:tools="http://scheR_585_11845@as.android.com/tools"> <data> <variable name="student1" type="example.com.testerapplication.sp.bean.student_XML2WAY"/> <variable name="student2" type="example.com.testerapplication.sp.bean.student_ObserField"/> <variable name="student3" type="example.com.testerapplication.sp.bean.student_Extend"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@={student1.name}"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{studenT2.NAME}"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{student3.namE}"/> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="update"/> </LinearLayout> </layout>
活动类@H_301_3@
public class MainActivity extends AppCompatActivity { private student_XML2WAY mstudent1; private student_ObserField mstudent2; private student_Extend mstudent3; @Override protected void onCreate(Bundle savedInstanceStatE) { super.onCreate(savedInstanceStatE); ActivitymainBinding binding = DataBindingUtil.inflate(LayoutInflater.from(this),R.layout.activity_main,null,falsE); mstudent1 = new student_XML2WAY(); mstudent1.setName("XML First"); mstudent2 = new student_ObserField(); mstudent2.getName().set("ObserField Second"); mstudent3 = new student_Extend(); mstudent3.setName("Extend Third"); binding.setstudent1(mstudent1); binding.setstudent2(mstudent2); binding.setstudent3(mstudent3); setContentView(binding.getRoot()); binding.btn1.setOnClickListener(new View.onClickListener() { @Override public void onClick(View v) { mstudent1.setName("student1"); mstudent2.getName().set("student2"); mstudent3.setName("student3"); } }); } }
如果我将直接访问模型,我将使用BaSEObservable,就像在student_Extend中一样.我将在我的Activity中有一个student_Extend实例,我将在onCreate中设置变量:@H_301_3@
student mstudent = new student("John Doe",42); // binding.setstudent(mstudent); //later: mstudent.setAge(37);
如果正确实施,这也将改变UI(以及模型中)的年龄.@H_301_3@
如果您不想直接访问模型并希望使用viewmodel,我可以使用ObervableFields:@H_301_3@
public class student { private String name; private int age; //Corresponding setters and getters } public class studentviewmodel { private ObservableField<student> mstudentField = new ObservableField<>(); //if I have a large model class,and only want to use some fields,//I create some getters (and setters,for the two way attributes) //Something like this: public int getAge() { return mstudentField.get().getAge(); } public void setAge(int newAgE) { return mstudentField.get().setAge(newAgE); } }
因此,我在Activity中创建了一个studentviewmodel实例,并将其设置为绑定.伪xml看起来像这样:@H_301_3@
<layout> <data> <variable name="studentviewmodel" type="locaction.of.studentviewmodel"> <!-- or do an import --> </data> <EditText android:text="@={studentviewmodel.agE}"/> </layout>
因此,viewmodel方法更“清晰”,因为您几乎将所有与视图有关的内容外包.把你的BindingAdapter,点击方法,转换器方法放在那里,保持你的活动干净.此外,您不直接更改您的模型.
对于简单的类和项目,这种方法可能过度.
以上是大佬教程为你收集整理的android – 双向数据绑定(在xml中),ObservableField,BaseObservable,我应该用哪个进行双向数据绑定?全部内容,希望文章能够帮你解决android – 双向数据绑定(在xml中),ObservableField,BaseObservable,我应该用哪个进行双向数据绑定?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。