订阅多个视图到A视图onclick和可见性更改RxAndroid

时间:2018-01-11 18:58:51

标签: android kotlin rx-java rx-android

我是使用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的可见性也会影响其他观看次数。

我如何实现这一点以及一起点击可观察性。

2 个答案:

答案 0 :(得分:2)

最接近的事情是这样的:

 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

答案 1 :(得分:0)

无法订阅/收听视图的可见性更改,至少在没有扩展和覆盖的情况下也是如此。 RxBinding都没有提供任何可观察的内容。

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