订阅多个视图到一个视图onclick和可见性改变RxAndroid

我新使用RxJava,并且仍然熟悉很多概念。 试图在一个项目中使用它,我想要做的是订阅一个视图的点击事件来改变另一个视图的可见性。 这是我的审判工作。

RxView.clicks(info_overlay).map { _ -> View.GONE }.subscribe { AppCache().hasSeenInfoScreen = true info_overlay_child_take_a_helfie.visibility = it info_overlay_child_subscription.visibility = it info_overlay_child_description.visibility = it info_overlay_child_header.visibility = it } 

不过,我也想订阅info_overlay可见性。 这样info_overlay的可见性info_overlay影响其他视图。

我如何实现这一点和点击观察在一起。

2 Solutions collect form web for “订阅多个视图到一个视图onclick和可见性改变RxAndroid”

最接近的事情是这样的:

  RxView.globalLayouts(info_overlay) .map { info_overlay.visibility } .distinct() .subscribe { newVisibility -> info_overlay.run { (0 until childCount) .map(this::getChildAt) .forEach { view -> view.visibility = newVisibility } } } 

如果您不需要更改所有的子视图使用方法如下:

  RxView.globalLayouts(info_overlay) .map { info_overlay.visibility } .distinct() .subscribe { newVisibility -> info_overlay_child_take_a_helfie.visibility = newVisibility ... } 

解释。 我从这个答案采取了想法https://stackoverflow.com/a/32778292/4727432

 myView.setTag(myView.getVisibility()); myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int newVis = myView.getVisibility(); if((int)myView.getTag() != newVis) { myView.setTag(myView.getVisibility()); //visibility has changed } } }); 

粗略地说,上面的代码和RxView.globalLayouts()是一样的。 之后,我会映射值来查看可见性。 如果可见性发生变化,我已经添加了distinct ,以便只能调用subscribe

没有办法订阅/收听视图的可见性变化,至少不是没有扩展和覆盖。 RxBinding都不提供可观察的。

无论如何,使用kotlin你可以实现这个使用委托,扩展属性和观察它。 但我怀疑这可能是痛苦的,你必须限制在任何地方使用扩展属性来代替visibility

  • 设置一个字段的值,而不用调用set方法 - Kotlin
  • RealmResults大小正在返回零
  • ResourceNotFoundException在升级到Canary 6后,在API 16 AVD上运行Kotlin项目
  • Kotlin:我如何请求从模拟器访问ACCESS_FINE_LOCATION?
  • 未解决的参考:在Koltin写的活动GlideApp
  • onCreate在抽象父活动no kotlin中调用
  • 如何获取Android Studio中的用户输入数值并将其转换为kotlin中的variablesint?
  • Android工作室3.0.1:执行失败的任务'应用程序:processDebugGoogleServices'
  • Android Kotlin - Volley意外的响应代码400
  • 预期types不接受Java中的空值,但Kotlin中的值可能为空
  • 为什么添加谷歌的火力点引起Dex错误?
  • Kotlin language will be the best programming language for Android.