Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android-使用数据绑定,在活动上而不是布局上_Android_Mvvm_Rx Android_Android Databinding_Rx Java2 - Fatal编程技术网

android-使用数据绑定,在活动上而不是布局上

android-使用数据绑定,在活动上而不是布局上,android,mvvm,rx-android,android-databinding,rx-java2,Android,Mvvm,Rx Android,Android Databinding,Rx Java2,我在MVVM设计模式中工作。 我想使用数据绑定或RXJava,以便在模型发生更改时通知视图。 数据绑定可以在xml中完成。 但是我想通知活动模型的更改,并做一些更复杂的事情。 假设我希望文本视图在文本不为空时更改颜色。 你能帮我通过数据绑定或RXJava完成吗 这是我的密码: xml 视图模型 import android.databinding.BaseObservable; import android.databinding.Bindable; public class My

我在MVVM设计模式中工作。 我想使用数据绑定或RXJava,以便在模型发生更改时通知视图。 数据绑定可以在xml中完成。 但是我想通知活动模型的更改,并做一些更复杂的事情。 假设我希望文本视图在文本不为空时更改颜色。 你能帮我通过数据绑定或RXJava完成吗

这是我的密码:

xml

视图模型

    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);
    }

}

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

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

在您的活动中:

public class MainActivity extends AppCompatActivity implements ViewModelCallback
在您的ViewModel中

public interface ViewModelCallback{
   void ActionCallback();
}
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);
}

您还应该在onDestroy中删除它。

您可以创建一个回调机制来触发活动中的方法。这仍然会首先通知ViewModel,但效果相同

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

在您的活动中:

public class MainActivity extends AppCompatActivity implements ViewModelCallback
在您的ViewModel中

public interface ViewModelCallback{
   void ActionCallback();
}
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);
}

您还应该在onDestroy中删除它。

但我想在模型发生更改时通知活动,并执行更复杂的操作。。为什么要这样做?VM获取更改并通知属性。就这些了。如果本机不支持绑定,您可以使用
@BindingAdapter
添加您自己的绑定。谢谢您的回答。我读过@BindingAdapter,意识到它只能在setter中使用。但我需要一个getter。如果我想在我的模型中显示/隐藏一个视图,那么在你的
中添加
android:background=“@{viewModel.textViewColor}”
,并在
MyViewModel
@pspink中添加
@Bindable int-getTextViewColor()
方法,谢谢你的回答,但我不想直接在xml中这样做。当然,它在这个特定的情况下会起作用,但是如果我想让我的viewModel告诉视图可见,而不知道恒定的视图数。可见,我希望活动能够处理它。因此,您需要在xml/presenter/View模型中设置一些视图属性(如
android:text
)和一些(比如,
android:background
)通过活动?这有意义吗?当然,您仍然可以调用
viewModel.addOnPropertyChangedCallback(…)
main活动#onCreate
中,因此现在,当文本更改时,将在活动中调用回调,但是…添加回调后,视图模型有一个对活动的引用。这是您希望避免的事情…但是我想在模型更改时通知活动并执行更复杂的操作…为什么活动?VM获取更改并通知属性。应该就这些了。如果绑定本机不支持,您可以使用
@BindingAdapter
添加您自己的绑定。感谢您的回答。我阅读了关于@BindingAdapter的内容,并意识到它只能用于setter。但我需要它作为getter。如果我需要一些布尔值f滞后于我的模型,它告诉我显示/隐藏一个视图,所以在你的
中添加
@Bindable int getTextViewColor()
MyViewModel
@pspink中的
方法,谢谢你的回答,但我不想直接用xml来做。当然,它在这个特定的情况下会起作用,但是如果我想让我的viewModel告诉视图是可见的,而不知道恒定的视图数量。可见,我希望活动能够处理它。因此,您可以使用一些视图属性nt通过活动在xml/presenter/view模型(如
android:text
)和一些(如
android:background
)中设置?这有意义吗?当然,您仍然可以调用
viewModel.addOnPropertyChangedCallback(…)
main活动#onCreate
中,因此现在,当文本更改时,在活动中调用回调,但是…添加回调后,视图模型有一个对活动的引用。这是您希望避免的事情…谢谢,但我不希望我的视图模型有对活动的引用。这是违反MVP的原则。我不确定,这只是一个回调,它没有使用适合Android的代码。你会很快意识到,这种技巧并不意味着你的应用不遵循MVVM原则(就像WPF中的代码隐藏一样。代码隐藏并不自动意味着违反MVVM)谢谢,但我不想让我的视图模型引用该活动。这与MVVM原则背道而驰。对此我不确定,这只是一个回调,并且它没有使用适用于Android的代码。你很快就会意识到,这种伎俩并不意味着你的应用程序不遵循MVVM原则(就像WPF中的代码隐藏一样。代码隐藏并不自动意味着违反MVVM)
viewModel.addCallback(this)