Android 视图切换:如何阻止用户之间的交互?

Android 视图切换:如何阻止用户之间的交互?,android,Android,我使用视图切换器在视图之间切换,切换方式类似于任务中的标准活动切换。例如,切换器中的当前视图可能有一个按钮,单击该按钮可启动视图切换:当前视图(现在已过时)滑出,并被新的当前视图替换(滑入) 动画切换只有一个好处:我找不到正确的方法来告诉滑动视图停止处理用户事件,比如触摸事件。因此,如果操作速度足够快,而且不必那么快,用户可以多次单击启动视图切换的按钮,这很糟糕。单击(或任何用户操作)启动视图切换后,我希望使滑动视图上的所有其他用户事件无效并忽略它们 是否有一种干净、标准的方法来做到这一点?我在

我使用视图切换器在视图之间切换,切换方式类似于任务中的标准活动切换。例如,切换器中的当前视图可能有一个按钮,单击该按钮可启动视图切换:当前视图(现在已过时)滑出,并被新的当前视图替换(滑入)

动画切换只有一个好处:我找不到正确的方法来告诉滑动视图停止处理用户事件,比如触摸事件。因此,如果操作速度足够快,而且不必那么快,用户可以多次单击启动视图切换的按钮,这很糟糕。单击(或任何用户操作)启动视图切换后,我希望使滑动视图上的所有其他用户事件无效并忽略它们


是否有一种干净、标准的方法来做到这一点?我在滑动视图上尝试了setEnabled(false),但子视图中的单击侦听器似乎在之后仍会处理。我要避免的是查找所有事件处理程序并添加验证代码,以确保在视图实际滑出时不会执行任何操作。

在单击侦听器中,在启动视图切换之前,我相信您应该能够禁用侦听器


我想其他UI交互仍然是可能的。也许您需要一个masterDisable方法,该方法将禁用该视图上的所有UI交互,您可以在切换视图之前调用该方法。

没有方法告诉父级禁用其所有子级事件。而且,对父对象调用setEnabled(false)不会禁用其子对象


可能最简单的方法是在按钮上调用
setEnabled(false)

可能是,如果您将淡出视图的子控件的可见性设置为GONE,您可以在侦听器中检查相同的设置,并仅处理可见视图的事件。

嗯,这很痛苦,但我想我终于找到了实现我想要的东西的正确方法,你真的必须找到Android API希望你如何做到这一点。下面是我如何管理滑出的子视图:

childView.startAnimation(animation);
parentView.removeView(childView); // makes childView a "disappearing child" of parentView
这可能看起来很奇怪,但当您这样做时,childView仍然在其父视图中绘制,即使它不再“物理”在那里(它不再接收用户输入,这是我最初追求的行为)。因此,childView成为parentView的“消失的孩子”,这是在ViewGroup中实现的一个非常特殊的情况。当动画结束时(通过AnimationListener),您必须执行以下操作:

parentView.clearDisappearingChildren();
否则,parentView仍将绘制不再设置动画的子视图的像素

请注意,我尝试的第一件事是:

childView.startAnimation(animation);
动画结束时:

parentView.removeView(childView);

尽管这样做对我来说是很自然的,但一切都开始失控了!我开始在ViewGroup.dispatchDraw中深入获取NullPointerException。所有这些都是因为AnimationListener.onAnimationEnd是在ViewGroup.dispatchDraw的执行过程中调用的,更改子视图列表在当时是一个非常糟糕的主意…

我遇到了类似的问题,希望与大家分享我的解决方案。如前所述,我重写Activity.dispatchTouchEvent方法。在这样做的过程中,我在将所有触摸事件发送到其他视图之前拦截它们

public boolean mDisplayBlocked = false;

@Override
public boolean dispatchTouchEvent(MotionEvent pEvent) {
    if (!mDisplayBlocked) {
        return super.dispatchTouchEvent(pEvent);
    }
    return mDisplayBlocked;
}

是的,视图滑出可能包含启动其他视图开关的交互式视图。如果Android API没有提供一种干净的方式来控制父视图级别的UI事件,我想我别无选择,只能在子视图级别实现某种UI启用/禁用逻辑,这将是一个很大的工作。不是真的,它只需要一个小函数作为一个视图。不是真的,它只需要一个小函数作为两个参数:一个视图和一个布尔值。它将根据传递的布尔参数启用/禁用视图。然后它会测试视图,看看它是否是
ViewGroup
的实例,如果是的话,它会遍历ViewGroup的子视图,在每个子视图上调用自己。然后,要启用/禁用,只需在传递父视图组后调用该函数。完成。抱歉,我的评论编辑时间不足。我想知道为什么启用的属性不是从父视图到子视图自然继承的。在我看来,它应该是,就像visibility属性一样,但它不是我的API。我个人认为这是正确的方法。这样,如果您有一个包含两个较小子按钮的大按钮,则可以启用/禁用该大按钮,而不会影响两个内部按钮。但我希望子视图在动画播放时保持可见。虽然也许我可以使用某种缓存来显示视图滑出的图像,而不是视图本身。事实上,我刚刚意识到ViewSwitcher在滑出的视图上调用setVisibility(view.GONE),所以似乎这是一种仍然可以与已消失的视图交互的情况!这比我想象的更糟糕…基本上是Android中的默认值()。好东西。干杯