2011-12-12 27 views
6

Quiero crear algunas vistas de desplazamiento utilizando el Buscapersonas de vistas horizontales. La vista izquierda debe tener un ancho de pantalla completo, pero solo un cuarto de ancho (será un panel vertical como en el navegador Dolphin). Es posible hacer eso? Cambié android:layout_width en el diseño correcto, pero no funcionó.Android anchuras diferentes de diseños en ViewPager

Mi código:

public class TestActivity extends FragmentActivity { 

@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_view); 

    MyPagerAdapter adapter = new MyPagerAdapter(); 
    ViewPager pager = (ViewPager) findViewById(R.id.panelPager); 
    pager.setAdapter(adapter); 
    pager.setCurrentItem(0); 
    } 
} 

main_view.xml

<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/panelPager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 
</LinearLayout> 

MyPagerAdapter.java

public class MyPagerAdapter extends PagerAdapter { 

@Override 
public int getCount() { 
    return 2; 
} 

@Override 
public Object instantiateItem(final View collection, final int position) { 

    LayoutInflater inflater = 
      (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    int resId = 0; 
    switch (position) { 
    case 0: 
     resId = R.layout.left; 
     break; 
    case 1: 
     resId = R.layout.right; 
     break; 
    } 

    View view = inflater.inflate(resId, null); 
    ((ViewPager) collection).addView(view, 0); 

    return view; 
} 

@Override 
public void destroyItem(final View arg0, final int arg1, final Object arg2) { 
    ((ViewPager) arg0).removeView((View) arg2); 

} 

@Override 
public boolean isViewFromObject(final View arg0, final Object arg1) { 
    return arg0 == ((View) arg1); 

} 

left.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="LEFT" /> 

</LinearLayout> 

right.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="50dp" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:background="@color/light_blue" > 


<TextView 
    android:id="@+id/textView2" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="RIGHT"/> 

</LinearLayout> 
+0

Sí, es posible, todo es posible. ¿Puedes darnos un código de lo que has hecho? – Warpzit

+0

¿Lo resolvió? –

Respuesta

1

En cuanto a la fuente de ViewPager, esto no es algo que está diseñado para hacer; usa su propio ancho para calcular las distancias de desplazamiento, etc., con la suposición clara de que todos los niños tendrán el mismo ancho que el propio ViewPager.

Para su caso específico hay puede ser una solución hacky, sin embargo. Puede especificar un margen entre páginas adyacentes, y este margen puede ser negativo. Esto puede dar el resultado que desee, siempre que el orden Z de los hijos de ViewPager sea apropiado. Pruébalo y mira si hace lo que necesitas.

2

Adrian tiene toda la razón. ViewPager no es diseñado para mostrar una porción de la próxima publicación como una vista previa/avance pero puede hacerlo. En mi clase ViewPagerCursorAdapter extends PagerAdapter corro esto:

public Object instantiateItem(View collection, final int position) { 
    cursor.moveToPosition(position); 
    View newView = getPageView(cursor, collection); 
    if (cursor.getCount() > 1) { 
     ((ViewPager)collection).setPageMargin(-overlapMargin); 
     if (! cursor.isLast()) { newView.setPadding(0, 0, overlapMargin, 0); } 
    } 
    ((ViewPager) collection).addView(newView); 
    return newView; //returns the object reference as the tag for identification. 
} 

Usted se topado con un problema de superposición extraña z. El truco consiste en aplicar el fondo solo al fondo de ViewPager o aplicarlo a la vista dentro de la nueva Vista para la que acaba de establecer el relleno. Se ve bien y funciona muy bien.

+0

He usado el código anterior y estoy haciendo que los niños se superpongan en el visor. ¿Me puedes ayudar con esto? – Noundla

9

Consulte la respuesta de Murphy en this question. Es necesario reemplazar el método de PagerAdapter getPageWidth() en su clase PagerAdapter, así por ejemplo:

@Override 
public float getPageWidth(int page) { 
    if(page==0) { 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     return (float)LEFT_FRAGMENT_PIXEL_WIDTH/size.x; 
    } 
    else 
     return super.getPageWidth(page); 
} 
Cuestiones relacionadas