Anchos diferentes de diseños de Android en ViewPager

Quiero crear alguna vista de desplazamiento usando el buscador de vista horizontal. La vista izquierda debe tener un ancho de pantalla completa, pero sólo 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ó.

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> 

Revise la respuesta de Murphy sobre esta cuestión . Necesita anular el método getPageWidth() de PagerAdapter en su clase PagerAdapter, como esto, 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); } 

Adrian tiene razón. ViewPager no está diseñado para mostrar una parte de la siguiente entrada como una vista previa / teaser, pero puede hacerlo. En mi ViewPagerCursorAdapter extends PagerAdapter clase ViewPagerCursorAdapter extends PagerAdapter 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. } 

Se encontrará con un extraño problema de superposición. El truco consiste en aplicar el fondo sólo al fondo de ViewPager o aplicarlo a la vista dentro del newView que acaba de configurar el relleno para. Se ve bien y funciona muy bien.

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

Sin embargo, para su caso específico puede haber una solución alternativa. 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 del ViewPager sea apropiado. Probarlo y ver si hace lo que necesita.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.