订阅多个视图到A视图onclick和可见性变化RxAndroid
Subscribing multiple views to A views onclick and visibility change 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
的可见性也会影响其他视图。
我如何实现这一点和同时观察到的点击。
无法 subscribe/listen 更改视图的可见性,至少在没有扩展和覆盖的情况下是这样。
None observable 也不是由 RxBinding 提供的。
无论如何,使用 kotlin,您可以使用委托、扩展属性和观察来实现这一点。但我怀疑这可能会很痛苦,你必须限制在任何地方使用扩展名 属性 代替 visibility
最接近的东西是这样的:
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
...
}
解释。我从这个答案中得到了灵感
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
。
我是 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
的可见性也会影响其他视图。
我如何实现这一点和同时观察到的点击。
无法 subscribe/listen 更改视图的可见性,至少在没有扩展和覆盖的情况下是这样。 None observable 也不是由 RxBinding 提供的。
无论如何,使用 kotlin,您可以使用委托、扩展属性和观察来实现这一点。但我怀疑这可能会很痛苦,你必须限制在任何地方使用扩展名 属性 代替 visibility
最接近的东西是这样的:
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
...
}
解释。我从这个答案中得到了灵感
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
。