2012-01-27 14 views
20

muszę mieć ViewPager Wewnątrz ScrollView ale ViewPager prostu nie pojawia się, gdy jest w ScrollView, wszystko jest ok, gdy nie używam ScrollView.ViewPager w Scrollview

Widziałem kilka takich pytań zadawanych tutaj na stackoverflow lub w innych witrynach i wszystkie z nich zostały odebrane, że musisz umieścić android:fillViewport="true" w swoim przewijanym widoku, aby rozwiązać problem, ale to rozwiązanie nie działa dla mnie , ViewPager nadal nie pojawia się, nawet jeśli mam android:fillViewport="true" w moim ScrollView.

Domyślam się, że coś się zmieniło w api lub Androidzie na Androidzie i to rozwiązanie już nie działa, czy ktoś wie, jak mogę zrobić ViewPager pojawiać się w ScrollView?

UPDATE: Działający układ XML Scrollview:

<ScrollView 
    android:id="@+id/scrollView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fillViewport="true"> 


    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical"> 

      <android.support.v4.view.ViewPager 
       android:id="@+id/itemsViewPager2" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" > 
      </android.support.v4.view.ViewPager> 
    </LinearLayout> 
</ScrollView> 
+1

Należy dostarczyć więcej informacji o swoim problemie. Układ, na którym obecnie próbujesz uruchomić tę funkcję, na przykład. Czy próbowałeś zdefiniować dokładną wartość piksela dla wysokości ViewPagera? –

+0

Wow, dzięki za pomysł, grałem trochę z atrybutami wysokości i szerokości i faktycznie sprawiłem, że działało całkiem łatwo, zaktualizowane oryginalne pytanie z układem XML scrollview, który działa. – boogieman

+0

@ Boogieman proszę wstawić jako odpowiedź i oznaczyć ją tak. – Warpzit

Odpowiedz

17

wpadłem na podobny problem w przeszłości. Widok-pager musi mieć ustawioną wysokość (nie może zawijać treści). Ponieważ ViewPager ładuje oddzielne strony i nie wszystkie naraz, nie będzie wiedział, co właściwie oznacza "wrap-content". Ustawienie ustawienia layout_height na fill_parent lub dp pozwala na ViewPager statyczne ustawienie wysokości i odpowiednie reagowanie w innych układach.

+4

Jedyną rzeczą, która pracował jawnie ustawia wartość w dp. Nawet match_parent nie działa. –

2

Znalazłem rozwiązanie dla kopalni przy użyciu "HorizontalScrollView" zamiast ScrollView.

Najpierw utwórz activity_main.xml z poniższym kodem, w którym zdefiniujesz ViewPager.

 <?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="fill_parent" 
       android:orientation="vertical" > 

      <android.support.v4.view.ViewPager 
       android:id="@+id/pager" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" /> 
      </LinearLayout> 

A później tworzyć inny left.xml do definiowania HorizontalScrollView:

 <?xml version="1.0" encoding="utf-8"?> 
     <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res 
       /android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" > 

      <ImageView 
       android:id="@+id/imageView1" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:src="@drawable/ic_launcher" /> 
     </HorizontalScrollView> 
6
public class YourScrollableViewPager extends ViewPager { 

private static final int MATCH_PARENT = 1073742592; 

private int currentPageNumber; 
private int pageCount; 

public YourScrollableViewPager(Context context) { 
    super(context); 
    prepareUI(); 
} 

public YourScrollableViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    prepareUI(); 
} 

private void prepareUI() { 
    setOffscreenPageLimit(pageCount); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int height = 0; 
    if (getChildCount() != 0) { 
     View child = getChildAt(currentPageNumber); 
     child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
     int h = child.getMeasuredHeight(); 
     if (h > height) height = h; 
    } 
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 

public void onPrevPage() { 
    onMeasure(MATCH_PARENT, 0); 
} 

public void onNextPage() { 
    onMeasure(MATCH_PARENT, 0); 
}} 
+0

Dzięki, to działa dla mnie. Ale miałem do czynienia z pewnym problemem. Mam 2 fragmenty w widoku pager. Jeden ma NestedScrollView, a drugi ma widok RecyclerView. Tak więc z tym kodem rzucanym jest zepsuty w RecyclerView. – Andrew

-1

Wystarczy dodać androida: fillViewport = "true" do widzenia przewijania będzie działać

Powiązane problemy