带/不带baseObservable的android viewmodel [英] android viewmodel with/without baseObservable

查看:42
本文介绍了带/不带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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆