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 …
This is very interesting! Great information and it is also very well written. I will bookmark and comeback soon.
Keep visiting for more… You can mail me your queries too.
Can you just send me a sample project where it is working fine because I am getting exception ….
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. 🙂
Thanks Hardik
Mention Not Anal, You can write me on hardik.trivedi_11@yahoo.com if you are having any doubts in android. keep visiting.
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
wc 🙂
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!
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?
THANKS A TON!
I had exactly the same problem and your solution solved it. God bless you! 🙂
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.
Hi,
Yes you can not use more than one direct child for scrollview.
Means your scrollview should not be like
But it should be
Thanks, that was really awsome
Thanks Laith
Thank you for your article, it is perfect.
Thanks Vahid.
I wonder why it took me hours of searching on google to find your brilliant post. Works like a charm!
Thanks buddy for the comment. Keep Visiting 🙂
works totally fine ,thanks 🙂
Welcome Kartik 🙂
Thanks much for helping me solve a problem with a scrollable TextView within a ScrollView!
Welcome 🙂
Thanks much, this is simply great.
Yea. Thanks 🙂
Thank You, this was very helpful !
Welcome 🙂
You are a superstar! Many thanks for that!
Ha ha,
Keep Visiting the blog, and let live the stardom 😉
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.
ScrollView should not have a listview as a child. Totally wrong approach.
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?
Umm…. Can you send me that class and layout file or any needed things. And mention your problem in detail.
Mail me on hardik.trivedi_11@yahoo.com
is this problem needing a listview inside a scroll view and both needs to have scroll individually working solved?
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.
thanks for the code 🙂
😀 You are welcome
Thank you very much. This helped me a lot
Thanks Muthu
Its working great lol… Thank you so much….
Thanks Praveen
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….
Can u post your xml and Java code here ?
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.
Hm.. code seems fine. Have you tested in different OS versions ?
finally got it working…. bt the same does not work in jellybean…. 😦
actually it does not go inside onTouchListener of parent scoll as well as child scroll…
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.
Thanks buddy!!!
Welcome
Thanks Dude!!!
Hi, I’m having problem with your code 😦 I really need help on this.
Let me know your problem.I would be happy to help
best solution hardik.
Reblogged this on My Blog.
i guess its not too late to say thank you! it worked for me.
So much thanks …It really works fine for me
it is showing several exceptions in my project.please provide complete code
Excelent solution!
Thanks!