Update: The weird 0x00100000 value is the value of *VERY_WIDE*, which is assigned to the Layout's width if the *TextView*'s *mHorizontallyScrolling *field* *is set to *true*.
Calling *setHorizontallyScrolling(false)* or setting the * android:scrollHorizontally="false"* attribute in your XML does the trick as well :-) On Wednesday, October 31, 2012 7:11:33 PM UTC-4, Streets Of Boston wrote: > > 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