滚动太短而无法滚动时,Scrollview不会滑动

问题描述 投票:8回答:3

我对Android应用程序开发还很陌生,我一直在使用Android的SimpleOnGestureListener和ViewFlipper来进行滑动手势。 ViewFlipper有3个子级,每个子级都是ScrollView。当“活动”加载时,它们都会动态填充,并且此后不会更改。 ScrollView是SimpleOnGestureListener的附加位置。

这是我使用的布局:+ ViewFlipper++ ScrollView(x3,每个页面一个,每个页面具有以下内容:)+++ LinearLayout(垂直)++++ TextView++++ TableLayout(使用TableRows动态填充)++++查看

我用可以在网上任何地方找到的通用教程代码扩展了onFling方法,并且效果很好-除非其中一个ScrollViews包含的内容不足以滚动。

通过覆盖和调用SimpleOnGestureListener的每个方法上的super以添加打印到日志,我将问题缩小到触摸检测。

[当我在滚动的页面上滑动时,我在“ onClick”,“ onScroll”,“ onFling”等中充满了东西。在太短的页面上,我却在“ onClick”,“ onShowPress”“在onLongPress中”,并且只有当我触摸内容within太短的滚动视图的子对象时-如果我触摸其他位置,我什么都没有。

关于问题的想法,或者无论ScrollView有多大,如何检测滑动手势?

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


我对此有更多见识;当在滚动板(或WorkspaceView)中包含滚动视图时,似乎没有为每个运动事件调用onInterceptTouchEvent。

特别是,我在修改另一个视图类以解决此非常相同的问题时发现的行为(它并非鳍状肢所独有),请注意,这仅适用于Android 2.1:

如果滚动视图足够长,可以滚动,则ScrollView将捕获ACTION_DOWN运动事件,随后的每个ACTION_MOVE事件都将通过鳍状肢的onInterceptTouchEvent进行拦截,并在该事件中进行适当的拦截和处理。在android 2.2中,无论滚动长度如何,都会发生此行为。

返回2.1:如果滚动视图不够长,无法滚动,则ACTION_DOWN运动事件由滚动视图捕获,但返回到鳍状板的onTouchEvent。相同手势的所有后续ACTION_MOVE事件skip onInterceptTouchEvent函数,直接进入onTouchEvent函数!我解决此问题的方法是将onTouchEvent中具有的功能用于ACTION_MOVE事件,并将其重构为自己的方法。这样,如果它检测到以前未处理过事件,则可以先调用onInterceptTouchEvent的onTouchEvent,再调用该功能。

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项目中找到,现在在这里:Horizontal "tab"ish scroll between views)。在我们收到一个move事件并正在滚动的情况下(仅当我们故意选择拦截它时才会发生-即,它已在拦截函数中设置,因此我们已经去过拦截函数了),我们执行我们想要的移动行为。如果我们在此处收到一个move事件并且没有滚动,则通过onIntercept将事件发送回去,然后查看是否现在设置为滚动。如果是这样,我们将执行该操作。

虽然不优雅,但是可以使用!

我对Android应用程序开发还很陌生,我一直在使用Android的SimpleOnGestureListener和ViewFlipper来进行滑动手势。 ViewFlipper有3个子级,并且...

android scroll scrollview viewflipper
3个回答
7
投票
我需要创建一个扩展ScrollView的新类,并使用它:

1
投票
尝试在布局xml中为每个android:fillViewport="true"设置ScrollView。这告诉ScrollView与其包含的视图一样大。

0
投票
有同样的问题。当ScrollView的子项太短而没有滚动条时,您需要拦截其触摸事件。
© www.soinside.com 2019 - 2024. All rights reserved.