ScrollView inside ScrollView Scrolling problem

While designing rich layouts you might need to use two scrollview in your app.
Well ideally its not advised to use two scrollview in a view. So try to avoid it.

Why this problem occurs ? :

When you put two scrollview android just get confused which scroll view is touched. So sometimes it gets unable to deliver touch event.

But even if the requirement forces you to make such layouts. Try this…

Say case is somewhat like this….

<ScrollView android:id=”@+id/parent_scroll”
            android:layout_width=”fill_parent”
            android:layout_height=”wrap_content”
            android:layout_weight=”1″
            android:background=”@drawable/dotted_bg”
            android:focusableInTouchMode=”false”>
                        <LinearLayout   />
                        <LinearLayout   />
                        <LinearLayout  >
                        <ScrollView android:id=”@+id/child_scroll”  
                        android:layout_width=”fill_parent”
                        android:layout_height=”fill_parent”
                        android:background=”@drawable/text_box_bg”>
                    <TextView android:id=”@+id/text_description”
                        android:layout_width=”fill_parent”
                        android:layout_height=”fill_parent”
                        android:textColor=”@color/gray”
                        android:textSize=”12dip”
                        android:padding=”5dip”
                        android:scrollbars=”vertical”/>
                    <!–ScrollView>
                  </LinearLayout>
</ScrollView>

Step 1 : Provide unique id to both the scrollview.
Step 2 : get reference of that two scrollview in your activity.

     parentScroll=(ScrollView)findViewById(R.id.parent_scroll);
     childScroll=(ScrollView)findViewById(R.id.child_scroll);

Step 3: Now set touch listeners for both.

            parentScroll.setOnTouchListener(new View.OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {
                    Log.v(TAG,”PARENT TOUCH”);
                    findViewById(R.id.child_scroll).getParent().requestDisallowInterceptTouchEvent(false);
                    return false;
                }
            });
            childScroll.setOnTouchListener(new View.OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event)
                {
                    Log.v(TAG,”CHILD TOUCH”);
                                        // Disallow the touch request for parent scroll on touch of child view
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                    return false;
                }
            });

Done …

62 thoughts on “ScrollView inside ScrollView Scrolling problem

      1. Can you just send me a sample project where it is working fine because I am getting exception ….

        1. Actually I dnt have any working example. This snippet is part of one of my project. But you can send me your project. I will resolve your error and give back to you. 🙂

  1. Thanks a lot. That solved my problem of scrolling textview inside scrollview. Was scratching my head to get this working. Didn’t find this info anywhere else. Thanks again

  2. This informative article was definitely a really wonderful examine. My partner and i was impressed through the items of the post. I cannot wait to see what in addition you’ve waiting for you for individuals. We are surely getting excited about your next article. Cheers with regard to revealing!

  3. Thanks , I’ve recently been searching for information about this subject for ages and yours is the best I have discovered till now. But, what about the conclusion? Are you sure about the source?

  4. Hi Hardik,

    This approach is not working for me. If I use the same layout as you have described, it throws an exception saying java.lang.IllegalStateException: ScrollView can host only one direct child. I am working on Jelly Bean SDK.

    Please let me know if I am doing anything wrong.

    1. Hi,

      Yes you can not use more than one direct child for scrollview.
      Means your scrollview should not be like

      But it should be

  5. Hi.. I need to use a ScrollView inside a ListView. So that, whenever I scroll the screen the whole layout should scroll including EditText.

    My layout looks like

    Could you please suggest me the way to use parent scroll rather then list scroll.

      1. I have to do it forcefully.
        I am trying with your solution to scroll Listview and EditText simultaneously. Could you please guide me, will it work for me or not?

            1. This is only for scrollviews, when there are multiple scrollviews inside one scrollview. For Listview inside scrollview I would prefer not to use ListView, you should use LinearLayout as container then inflate and add views dynamically inside that container.

  6. hi,
    i hv a child scroll view inside parent scroll. The child scroll view id displayed at runtime on some click event. while it is visible on screen it does not scroll….
    i tried using ur method, bt it is not going inside onToch event of child… evn if i try to scroll the child, it goes inside touch event of parent….

  7. here is the xml-

    scrollParent=(ScrollView)findViewById(R.id.scrollParent);
    tblDropdown = (TableLayout) findViewById(R.id.tblDropdown);
    linearDropdown = (LinearLayout) findViewById(R.id.linearDropdown);
    scrollDropdown = (ScrollView) findViewById(R.id.scrollDropdown);

    scrollParent.setOnTouchListener(new View.OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
    Log.v(TAG,”PARENT TOUCH”);
    findViewById(R.id.scrollDropdown).getParent().requestDisallowInterceptTouchEvent(false);
    return false;
    }
    });

    scrollDropdown.setOnTouchListener(new View.OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event)
    {
    Log.v(TAG,”CHILD TOUCH”);
    // Disallow the touch request for parent scroll on touch of child view
    v.getParent().requestDisallowInterceptTouchEvent(true);
    return false;
    }
    });

    i hv even tried applying the touch event on tableDropdown and linearDropdown…..
    but even if i click on child scrollView , it goes inside parent onTouch event.

          1. Ok, as you are saying that code is working below 4.0. | also need to test that case. Let me check and get back to you.

Leave a reply to Hardik Trivedi Cancel reply