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

Reply via email to