带/不带baseObservable的android viewmodel [英] android viewmodel with/without baseObservable
本文介绍了带/不带baseObservable的android viewmodel的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我试图在 android 中查看模型,所以对于 MainViewModel.java 我写了这个:
<预><代码>公共类 MainViewModel 扩展了 ViewModel {私人字符串文本视图;私人字符串编辑文本;//@可绑定公共字符串 getTextView(){返回文本视图;}私有无效 setTextView(字符串值){文本视图=值;}//@可绑定公共 TextWatcher getEditTextWatcher() {返回新的 TextWatcher() {@覆盖public void onTextChanged(CharSequence s, int start, int before, int count) {setTextView(s.toString());}...};}}在 ActivityMain.xml 中我写了这个:
<预><代码><文本视图android:text="视图模型/数据绑定"android:layout_width="match_parent"android:layout_height="40dp"/><文本视图android:id="@+id/main_text_view"android:text="@{mainvm.textView}"android:layout_width="match_parent"android:layout_height="40dp"/><编辑文本android:id="@+id/main_edit_text"app:textChangeListener="@{mainvm.editTextWatcher}"android:layout_width="match_parent"android:layout_height="40dp"/>我收到 2 个错误:
找不到 的 setter接受参数类型android.text.TextWatcher"如果绑定适配器提供 setter,请检查适配器是否正确注释以及参数类型是否匹配.
还有,
错误:找不到符号类ActivityMainBindingImpl
有些文章使用@Binable注解扩展BaseObservable,这不是ViewModel的东西.
所以我的问题是如何解决这个问题?
解决方案
我无缘无故地让事情变得复杂.这是我的代码:
public class MyViewModel extends ViewModel{私有 Observabledata=new Observable<>("");//用空字符串初始化,以免崩溃公共字符串 getData(){return data.get();//如果我返回将成为可变的可观察本身,在类之外}公共无效集数据(字符串数据){data.setValue(data);//如果我接受 Observable 作为改变数据引用的参数,这就是为什么要传递字符串}}
在xml中:
并像往常一样将其绑定到 Activity 或 Fragment.
I was trying to view-model in android, so for MainViewModel.java I wrote this :
public class MainViewModel extends ViewModel {
private String textView;
private String editText;
//@Bindable
public String getTextView(){
return textView;
}
private void setTextView(String value){
textView=value;
}
//@Bindable
public TextWatcher getEditTextWatcher() {
return new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
setTextView(s.toString());
}
...
};
}
}
And in the ActivityMain.xml I wrote this :
<TextView
android:text="View-Model / Data-Binding"
android:layout_width="match_parent"
android:layout_height="40dp"/>
<TextView
android:id="@+id/main_text_view"
android:text="@{mainvm.textView}"
android:layout_width="match_parent"
android:layout_height="40dp"/>
<EditText
android:id="@+id/main_edit_text"
app:textChangeListener="@{mainvm.editTextWatcher}"
android:layout_width="match_parent"
android:layout_height="40dp"/>
I'm getting 2 errors:
Cannot find a setter for <android.widget.EditText app:textChangeListener> that accepts parameter type 'android.text.TextWatcher'
If a binding adapter provides the setter, check that the adapter is annotated correctly and that the parameter type matches.
And,
error: cannot find symbol class ActivityMainBindingImpl
Some article uses @Binable annotation extending BaseObservable, which is not a ViewModel thing.
So my question how can I solve this ?
解决方案
I was making thing complicated for no reason. Here is my code :
public class MyViewModel extends ViewModel{
private Observable<String> data=new Observable<>("");//initializing with empty string, so that it doesn't crash
public String getData(){
return data.get();//if I return the observable itself that will become mutable, outside the class right
}
public void setData(String data){
data.setValue(data);//if I accept Observable as parameter that will change reference of data, that's why passing string
}
}
In xml:
<TextView
android:id="@+id/main_text_view"
android:text="@{myvm.data}"
...
/>
<EditText
android:id="@+id/main_edit_text"
android:text=@{myvm.data}
....
/>
And bind this to Activity or Fragment as usual.
这篇关于带/不带baseObservable的android viewmodel的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文