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

Reply via email to