我使用视图切换器以类似于任务中切换的标准活动的方式在视图之间切换。例如,切换器中的当前视图可能有一个按钮,当单击该按钮时,启动视图切换:当前视图现在已过时,滑出,并由新的当前视图替换,该视图将滑入。
动画切换只适用于一件事:我找不到正确的方法来告诉滑出视图停止处理用户事件,如触摸事件。所以会发生什么,如果做得足够快,而且不必那么快,用户可以点击多次启动视图切换的按钮,这很糟糕。一旦点击(或任何用户操作)启动了一个视图切换,我想在滑动视图中使其无效并忽略所有其他用户事件。
有一种干净,标准的方法吗?我已经在滑出视图上尝试了setEnabled(false),但看起来子视图中的点击侦听器仍在后续处理。我想要避免的是寻找所有事件处理程序并添加验证代码,以确保在视图实际滑出时不执行任何操作。
答案 0 :(得分:17)
我遇到了类似的问题,想要分享我的解决方案。我重写了注释here的Activity.dispatchTouchEvent方法。在这样做的过程中,我会在将所有触摸事件发送到其他视图之前拦截它们。
public boolean mDisplayBlocked = false;
@Override
public boolean dispatchTouchEvent(MotionEvent pEvent) {
if (!mDisplayBlocked) {
return super.dispatchTouchEvent(pEvent);
}
return mDisplayBlocked;
}
答案 1 :(得分:1)
在您的点击监听器中,在启动视图切换之前,我相信您应该能够禁用该监听器。
我想其他UI交互仍然可能。也许您需要一个masterDisable方法,该方法将禁用该View上的所有UI交互,您可以在进行视图切换之前调用该交互。
答案 2 :(得分:1)
没有方法告诉父母禁用所有儿童的事件。而且,在父级上调用setEnabled(false)不会禁用它的子级。
最简单的方法可能是在按钮上调用setEnabled(false)
。
答案 3 :(得分:1)
可能是,如果为淡出视图的子控件设置可见性为GONE,则可以在侦听器中检查相同内容并仅处理可见视图的事件。
答案 4 :(得分:1)
嗯,这很痛苦,但我想我终于找到了实现我想要的正确方法,你真的必须找出Android API如何让你这样做。所以这就是我如何管理滑出的子视图:
childView.startAnimation(animation);
parentView.removeView(childView); // makes childView a "disappearing child" of parentView
这可能看起来很奇怪,但是当你这样做时,仍然会在其父级中绘制childView,即使它不再是“物理”的(它不再接收用户输入,这是我之后的行为)第一名)。因此,childView成为parentView的“消失的孩子”,这是一个在ViewGroup中实现的特殊情况。当动画结束时(通过AnimationListener),您必须执行:
parentView.clearDisappearingChildren();
否则parentView仍然会绘制非动画的像素 - 不再是childView。
请注意,我尝试的第一件事是:
childView.startAnimation(animation);
当动画结束时:
parentView.removeView(childView);
即使这种做法对我来说似乎很自然,但所有的一切都开始崩溃!我开始在ViewGroup.dispatchDraw中深入获取NullPointerException。所有这一切都是因为在执行ViewGroup.dispatchDraw期间调用了AnimationListener.onAnimationEnd,并且在那时更改子视图列表是一个非常糟糕的主意......