So, I have this ScrollView
with one child - a LinearLayout
that has two children: a TextView
and a ViewPager
. ViewPager
contains layout with many elements, that's why i need the ability to scroll vertically. Only pages in ViewPager
may be scrolled horizontally (that is: I'd like to swipe horizontally only within the ViewPager
). That one TextView
must not scroll horizontally but should scroll together with my ViewPager
.
Simple? No.
I've seen extremely similar issues at StackOverflow popping up (here, here and here and here). None of the suggested solutions work for me :(
What I see is this <- my sweet UI :), However I cannot scroll vertically :(
Embedding ScrollViews inside ViewPager is not an option - desing of the UI forbids this.
Maybe it's something with my programmatically filling each page in view pager? Hmmm...
Any suggestions would be appreciated.
My code:
activity_main.xml:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scrollView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/white" android:fillViewport="true" > <LinearLayout android:id="@+id/linearLayoutGeneral" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tvText" android:layout_width="fill_parent" android:layout_height="200dp" android:text="Test text" /> <android.support.v4.view.ViewPager android:id="@+android:id/viewpager" android:layout_width="fill_parent" android:layout_height="fill_parent" > </android.support.v4.view.ViewPager> </LinearLayout> </ScrollView>
each page in ViewPager has this layout:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:id="@+id/layoutData" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > </LinearLayout> </LinearLayout>
single element's layout in such a page:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="40dp" android:gravity="center" android:orientation="vertical" android:background="@android:color/white" > <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Large Text" android:background="@android:color/black" android:textColor="@android:color/white" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout>
A single page Fragment is also very simple:
public class DayFragment extends Fragment { private static final String TAG = DayFragment.class.getSimpleName(); public String tag; LinearLayout data; View mView; final int ROWS_NUM = 60; public DayFragment() { } /** * (non-Javadoc) * * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, * android.view.ViewGroup, android.os.Bundle) */ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) { // We have different layouts, and in one of them this // fragment's containing frame doesn't exist. The fragment // may still be created from its saved state, but there is // no reason to try to create its view hierarchy because it // won't be displayed. Note this is not needed -- we could // just run the code below, where we would create and return // the view hierarchy; it would just never be used. return null; } mView = (LinearLayout) inflater.inflate(R.layout.day, container, false); setUpControls(); generateData(); String text = getArguments().getString("text"); Log.d(TAG, "creating view with text: " + text); return mView; } private void setUpControls() { data = (LinearLayout) mView.findViewById(R.id.layoutData); } private void generateData() { for (int i = 0; i < ROWS_NUM; i++) { View v = createRow(i); data.addView(v); } } private View createRow(int num) { LayoutInflater inflater = (LayoutInflater) getActivity() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.row, null); TextView tv = (TextView) v.findViewById(R.id.textView); tv.setText("Data nr: " + num); return v; } public static DayFragment newInstance(String text) { Log.d(TAG, "newInstance with text: " + text); DayFragment f = new DayFragment(); f.tag = text; // Supply text input as an argument. Bundle args = new Bundle(); args.putString("text", text); f.setArguments(args); return f; } }