gpt4 book ai didi

android - 订阅多个 View 到A View onclick和可见性变化RxAndroid

转载 作者:行者123 更新时间:2023-11-29 19:02:56 26 4
gpt4 key购买 nike

我刚开始使用 RxJava,但仍然熟悉其中的很多概念。尝试在项目中使用它,我想做的是订阅一个 View 的单击事件以更改另一个 View 的可见性。这是我的试用版。

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 的可见性也会影响其他 View 。

我如何实现这一点以及一起观察到的点击。

最佳答案

最接近的东西看起来像这样:

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

如果您不需要更改所有 subview ,请使用以下方法:

 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

关于android - 订阅多个 View 到A View onclick和可见性变化RxAndroid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48214105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com