android - 在Activity而不是布局上使用dataBinding

标签 android mvvm rx-android android-databinding rx-java2

我正在使用 MVVM 设计模式。
我想使用 dataBinding 或 RXJava 以便在模型更改时通知 View 。
dataBinding 里面可以做 xml .
但我想通知 Activity 改变模型并做一些更复杂的事情。
假设我希望我的 TextView 在文本不为空时更改颜色。
你能帮我通过 dataBinding 或 RXJava 吗?

这是我的代码:

xml

<?xml version="1.0" encoding="utf-8"?>
<data>

    <variable
        name="viewModel"
        type="edi.com.mydatabindingsimple.MyViewModel" />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="@={viewModel.txt}" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@={viewModel.txt}" />

</LinearLayout>

Activity
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import edi.com.mydatabindingsimple.databinding.ActivityMainBinding;

    public class MainActivity extends AppCompatActivity {

        MyViewModel viewModel = new MyViewModel();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            final ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
            binding.setViewModel(viewModel);
        }
    }

View 模型
    import android.databinding.BaseObservable;
import android.databinding.Bindable;



public class MyViewModel extends BaseObservable{
    private String txt;

    @Bindable
    public String getTxt() {
        return txt;
    }

    public void setTxt(String txt) {
        this.txt = txt;
        notifyPropertyChanged(edi.com.mydatabindingsimple.BR.txt);
    }

}

最佳答案

您可以做的是创建一个回调机制来触发 Activity 中的方法。这仍然会先通知 ViewModel,但效果是一样的。

您可以创建一个新界面(或将其添加到 ViewModel 中)

public interface ViewModelCallback{
   void ActionCallback();
}

在您的 Activity 中:
public class MainActivity extends AppCompatActivity implements ViewModelCallback

在您的 View 模型中
private ArrayList<ViewModelCallback> callbacks = new ArrayList<>();

public void notifyCallbacks(){
  for(ViewModelCallback c : callbacks){
     if(c != null){
         c.ActionCallback
      }
   }
}

public void addCallback(ViewModelCallback c){
     callbacks.add(c);
}

在 NotifyPropertyChanged() 之后调用 notifyCallback。
并且不要忘记将您的 Activity 添加为 onCreate 中的回调
viewModel.addCallback(this)

您还应该在 onDestroy 中删除它。

关于android - 在Activity而不是布局上使用dataBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43071298/

相关文章:

android - RXAndroid 编写嵌套订阅的更好方法

java - 解密/验证 Firebase token

Android 浏览器媒体播放器(stagefright?)显示的媒体名称

c# - MVVM - 如何使格式化属性保持最新?

spring - 在RxJava Services中管理事务性的正确方法是什么?

android - 如何在 RxJava 流中间有条件地添加异步操作?

android - 不能再添加 Android 平台和构建 ionic 项目了吗?

android - 如何在 Imageview src 中保存数据?

wpf - WPF MVVM 用户控件的最佳实践。避免绑定(bind)问题

c# - 是否可以绑定(bind)到 XAML 中的 System.Windows.Interactivity.Behavior?