Thanks Piren! Your answer led me into the right direction.
This was the problem: The *ViewPager *contains *TextViews *as (grand-grand...) children. Before it actually starts scrolling it asks if the touched child (or one of the child's children) could scroll horizontally. If one of them does, the * ViewPager* won't scroll horizontally itself. Instead, it lets this child scroll. The *TextView* implements a method called '*canScrollHorizontally(int)*'. It uses the *mLayout *member to determine this method's return value. Sometimes, the *mLayout.mWidth* is 0x00100000 (= 1048576) and this weird value causes this *canScrollHorizontallly *method to incorrectly return *true *(instead of *false*). The method canScrollHorizontally is only available for API-level 14 or up... this may explain the issue... For now, I just subclass my *TextView* that appear in the *ViewPager *and override the *canScrollHorizontally *method, because I know the text in these *TextViews *can never scroll horizontally. public class MyTextView extends TextView { ... @Override public boolean canScrollHorizontally(int direction) { return false; } .... } On Wednesday, October 10, 2012 9:38:03 AM UTC-4, Piren wrote: > > The thing is that being Clickable shouldn't have any impact in this > scenario. Although a clickable view always consumes the touch event, in > ViewPager's case it should intercept it when it recognizes a drag gesture > (see its onInterceptTouchEvent implementation). > > You should override onTouch and onInterceptTouchEvent for all your custom > views and use logs to see how the events propagate through them (the proper > behavior would be the button intercepting onTouch and once your finger > moves enough in the X axes it should stop getting that event) > > My best guess is that the ViewPager cancels the drag because it believes > your views have horizontal scrolling - I didnt dig all the way through, but > it seems to be basing that mostly on child view sizes... since you said you > have custom layout logic, i'm thinking it makes the ViewPager return the > wrong result. try debugging ViewPager's canScroll method. > > they also have this comment in there: " // TODO: Add versioned support > here for transformed views. This will not work for transformed views in > Honeycomb+ ) " Kind of suspicious :) > > > On Tuesday, October 9, 2012 11:57:28 PM UTC+2, Streets Of Boston wrote: >> >> The targetSdk is 11. >> This is our hierarchy: >> >> -ViewPager >> | >> +-NoSaveStateFrameLayout >> | >> +-ProfileGridView >> | >> +-ProfileGridViewRow >> | >> +-FrameLayout >> | >> +-TextView >> >> Note that ProfileGridView contains one or more ProfileGridViewRows which >> contains one or more clickable TextView (i.e. our buttons). >> The ProfileGridView and ProfileGridViewRow are custom LinearyLayouts: The >> have their own measure and layout-logic. These two subclasses don't have >> any method or logic to capture or handle touch-events. >> >> Thanks! >> >> On Tuesday, October 9, 2012 11:31:03 AM UTC-4, Piren wrote: >>> >>> ViewPager is part of the support package and inherits from a ViewGroup , >>> it shouldn't matter much which OS version it runs on. >>> I have a similar setup and i dont experience this issue (using support >>> package v4, i assume you're using the same since you said you tested on >>> earlier os versions). >>> I can even press a button and see it switch to its pressed state and >>> then start a swipe without generating an onClick event. >>> >>> What is your targetSdkVersion? >>> >>> On Tuesday, October 9, 2012 4:27:31 PM UTC+2, Streets Of Boston wrote: >>>> >>>> Hi Kostya, >>>> >>>> Thanks for your answer. >>>> >>>> This bug (?) only happens on Jelly Bean (I don't have ICS devices to >>>> test it on). >>>> It works fine on Honeycomb and lower OS versions. >>>> >>>> It seems there is indeed a regression of the ViewPager in JB (and >>>> possibly ICS). >>>> >>>> Thanks. >>>> >>>> On Tuesday, October 2, 2012 12:47:41 PM UTC-4, Kostya Vasilyev wrote: >>>>> >>>>> Sounds like a bug in how ViewPager dispatches events (sorry for >>>>> stating the obvious). I'd consider looking at the source and comparing it >>>>> to ScrollView (which handles nested touchable areas just fine). >>>>> >>>>> -- K >>>>> >>>>> 2012/10/2 Streets Of Boston <flying...@gmail.com> >>>>> >>>>>> Hi everyone, >>>>>> >>>>>> I have a ViewPager that contains pages, each page with a bunch of >>>>>> Buttons (or clickable TextViews). When I set the buttons to >>>>>> 'setClickable(false)', swiping the ViewPager to another page works fine >>>>>> all >>>>>> the time. >>>>>> >>>>>> However, when the buttons are clickable (OnClick listener is set), >>>>>> the ViewPager won't do anything if the user put his or her finger down >>>>>> on >>>>>> the button when he or she starts a swipe or scroll. If the user swipes, >>>>>> the >>>>>> button 'eats' all the touch-events (MotionEvents). >>>>>> >>>>>> Is there a convenient way to make these buttons/textviews clickable >>>>>> and make the ViewPager swipe even if the user puts his finger on a >>>>>> button >>>>>> initially? >>>>>> (I'd like to avoid hacks and using GestureDetectors if possible) >>>>>> >>>>>> Thanks! >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Android Developers" group. >>>>>> To post to this group, send email to >>>>>> To unsubscribe from this group, send email to >>>>>> >>>>>> For more options, visit this group at >>>>>> http://groups.google.com/group/android-developers?hl=en >>>>> >>>>> >>>>> -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en