我正在使用 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/