如果滚动条太短,滚动查看不会滑动

我对Android应用程序开发相当陌生,我一直在玩滑动手势,使用Android的SimpleOnGestureListener和ViewFlipper。 有3个子ViewFlipper,每个是一个ScrollView。 当Activity加载时,它们全部被dynamic地填充,并且在之后它们不会改变。 ScrollView是SimpleOnGestureListeners附加的地方。

这是我正在使用的布局:
+ ViewFlipper
++ ScrollView(x3,每个页面一个,每个都有以下:)
+++ LinearLayout(垂直)
++++的TextView
++++ TableLayout(dynamic填充w / TableRows)
++++查看

我扩展了onFling方法,使用您可以在网上任何地方find的常见教程代码,并且它工作的很好 – 除非其中一个ScrollViews没有足够的内容滚动。

我已经缩小了问题的范围,通过覆盖并调用每个SimpleOnGestureListener的方法来添加一个print-to-log来触发检测。

当我在滚动的页面上滑动时,我会在onScroll的“onScroll”中得到一些“onClick”中的东西。在页面太短而无法滚动的页面中,我在onLongPress的onShowPress“”中获得“onClick” “,那只有当我触摸太短滚动视图的孩子的内容 – 如果我触摸到其他地方,我根本没有得到任何事件。

想法是什么错误,或者如何检测滑动手势,无论ScrollView有多大?

编辑:我已经确定,当我在Android 2.2模拟器上运行这个,而不是我已经使用的Android 2.1u1 DroidX模拟器,它消失了。 这在多个环境中是可重现的。


我对此有更多的了解。 看起来好像onInterceptTouchEvent不是每个运动事件调用当一个滚动视图包含在一个鳍(或WorkspaceView)。

特别是,我修改另一个视图类来解决这个问题(它不是独特的鳍状肢)时发现的行为如下 – 请注意,这只是Android 2.1:

如果滚动视图足够长,滚动视图将捕获ACTION_DOWN运动事件,并且每个后续的ACTION_MOVE事件都会经过鳍状肢的onInterceptTouchEvent,在那里被截取并正确处理。 在android 2.2中,无论滚动长度如何,都会发生这种情况。

回到2.1:如果scrollview的长度不够滚动,ACTION_DOWN运动事件不会scrollview捕获,而是返回到鳍状肢的onTouchEvent。 所有相同手势的后续ACTION_MOVE事件都会跳过 onInterceptTouchEvent函数并直接进入onTouchEvent函数!

我解决这个问题的方法是将我在onTouchEvent中的function用于ACTION_MOVE事件,并将其重构为自己的方法。 通过这种方式,如果检测到事件先前没有处理,我可以让onTouchEvent调用onInterceptTouchEvent,然后调用该function。

case MotionEvent.ACTION_MOVE: if (touchState == TOUCH_STATE_SCROLLING) { handleScrollMove(ev); } else { // Log.d("workspace","caught a move touch event but not scrolling"); //NOTE: We will never hit this case in Android 2.2. This is to fix a 2.1 bug. //We need to do the work of interceptTouchEvent here because we don't intercept the move //on children who don't scroll. Log.d("workspace","handling move from onTouch"); if(onInterceptTouchEvent(ev) && touchState == TOUCH_STATE_SCROLLING){ handleScrollMove(ev); } } break; 

这是来自WorkspaceView.java(Android的Workspace.java的修改,在google代码上的andro-views项目中find,现在在这里: 水平“标签”ish滚动视图之间 )。 在我们收到一个移动事件的情况下,我们正在滚动(这只发生在我们故意select拦截它的情况下 – 即,它被设置在拦截函数中,所以我们已经到了拦截函数),我们执行我们渴望的举动行为。 如果我们在这里收到一个移动事件,而我们没有滚动,那么我们通过onIntercept返回事件,然后看看现在是否设置为滚动。 如果是的话,我们执行这个动作。

这不是优雅的,但它的作品!

Solutions Collecting From Web of "如果滚动条太短,滚动查看不会滑动"

我需要创build一个扩展ScrollView的新类,并使用它:

 @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); return gestureDetector.onTouchEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent ev){ gestureDetector.onTouchEvent(ev); super.dispatchTouchEvent(ev); return true; } 

我不知道为什么,但如果我尝试返回任何东西,但在dispatchTouchEvent(真正的逻辑

 return (gestureDetector.onTouchEvent(ev) || super.dispatchTouchEvent(ev)); 

如果我理解正确),它不起作用,这是。

尝试在每个ScrollView的布局xml中设置android:fillViewport="true" 。 这就告诉ScrollView和它包含的视图一样大。