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 <[email protected]>
>>>>>>
>>>>>>> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en