2011-12-16 35 views
7

¿El ViewPager tiene que ser el único objeto presente dentro del diseño de la actividad? estoy tratando de implementar algo como esto:Android ViewPager dimensión

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/reader_layout" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

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

<Gallery 
    android:id="@+id/miniatures_gallery" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /></LinearLayout> 

Dónde debería tener un gran localizador de desplazamiento en la parte superior (y lo tengo) y una galería más pequeña que el desplazamiento bajo. Esto me muestra solo el localizador y no la galería. ¿Alguna sugerencia?

+1

intente esto: http://helpmeco.de/2012/1/android-viewpager-and-gallery-integration – browep

+0

TNX esto estuvo ... pero tengo un accidente en la rotación de la página, cualquier sugerencia para que? –

+0

¿tienes un rastro de pila? ¿Cogiste el proyecto de github o copiaste pasta del tutorial? – browep

Respuesta

6

El ViewPager no es compatible con wrap_content ya que (normalmente) nunca tiene todos sus hijos cargados al mismo tiempo, y por lo tanto no puede obtener un tamaño apropiado (la opción sería tener un buscapersonas que cambie de tamaño cada vez que tenga página cambiada).

Sin embargo, puede establecer una dimensión precisa (por ejemplo 150dp) y match_parent funciona tan bien.
También puede modificar las dimensiones de forma dinámica a partir del código cambiando el -attribute height en su LayoutParams.

+0

¡ok gracias, sí funcionaba con dimensiones fijas! –

+1

¿Qué es lo que no funciona con eso? Otra solución, que funciona si desea que el localizador para llenar cualquier espacio vacío es la siguiente: \t \t Luego, el buscapersonas deja suficiente espacio para cualquier otra vista. – Jave

0

He resuelto el problema con un par de hacks. Esto es lo que implica:

En primer lugar, necesita un diseño que haga caso omiso de ViewPager 's límite de altura. Lo usé como diseño principal para los artículos ViewPager.

public class TallLinearLayout extends LinearLayout { 

    public TallLinearLayout(Context context) { 
     super(context); 
    } 

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

    public TallLinearLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, MeasureSpec.UNSPECIFIED); 
    } 
} 

entonces escribió la lógica para cambiar el tamaño ViewPager:

private class ViewPagerContentWrapper implements OnGlobalLayoutListener { 
    private ViewPager mViewPager; 

    public ViewPagerContentWrapper(ViewPager viewPager) { 
     mViewPager = viewPager; 
    } 

    @Override 
    public void onGlobalLayout() { 
     int position = mViewPager.getCurrentItem(); 
     check(position); 
     check(position + 1); 
    } 

    private void check(int position) { 
     ViewGroup vg = (ViewGroup) mViewPager.getChildAt(position); 
     View v = vg == null ? null : vg.getChildAt(0); 

     if (v != null) { 
      int height = v.getHeight(); 
      if (height > mViewPager.getHeight()) { 
       resize(height); 
      } 
     } 
    } 

    private void resize(int height) { 
     mViewPager.setLayoutParams(
       new LinearLayout.LayoutParams(
         LinearLayout.LayoutParams.MATCH_PARENT, 
         height 
       ) 
     ); 
    } 
} 

Qué me registré como oyente layout global:

viewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewPagerContentWrapper(viewPager)); 
+0

Esto creará un ciclo de diseño infinito. Inicialmente, el sistema solicita OnLayout que llamará a su OnGlobalLayoutListener que llamará a OnLayout que llamará a OnGlobalLayoutListener y así sucesivamente ... –

4

Asignar peso diseño para ver localizador como 1 & height = 0DP en lugar de wrap_content

<android.support.v4.view.ViewPager 
    android:id="@+id/page_viewer" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1"/> 
+0

cómo implementar en RelativeLayout? – lrn2prgrm

Cuestiones relacionadas