2012-09-06 9 views
14

ACTUALIZADO: ¿Puedo usar la siguiente distribución para implementar 3 textviews en ViewPager:Android: Cómo implementar ViewPager y vistas en el archivo xml sola

<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"> 

     <TextView 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="view 1"/> 
     <TextView 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="view 2"/> 
     <TextView 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="view 3"/> 

    </android.support.v4.view.ViewPager> 
</LinearLayout> 

Quiero poner en práctica el ViewPager para estos 3 puntos de vista. y quiero tener viewpager y esas 3 vistas en un solo archivo xml. Cada página contiene cada vista de texto. He visto algunos ejemplos, pero cada página se implementó utilizando un archivo de diseño xml por separado.

¿Cómo puedo implementar viewpager para estas 3 vistas en un solo archivo xml? Si es posible, proporcione un ejemplo de código o ejemplo.

+0

Puede agregar una captura de pantalla de muestra. – Sekar

Respuesta

1

¿Cómo puedo implementar el ViewPager para estos 3 puntos de vista en un único archivo XML.

Lo sentimos, pero eso no es posible.

+0

http://stackoverflow.com/questions/18710561/can-i-use-view-pager-with-views-not-with-fragments –

+0

es bastante posible. si configura viewPager.setOffscreenPageLimit (N); –

-2

Simplemente: añadir un ViewPager en su archivo y poner dentro de su TextView 3 ...

+0

déjame intentarlo. En realidad no lo he implementado todavía. Acabo de ver ejemplos de cómo implementarlo y observé que el código de página y el código de Viewpager (xml) se implementan en archivos separados. –

1

añadir esto en el archivo de diseño xml

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

crear 3 Fragment s y agregar cada TextView para cada fragmento . A continuación, crear un adaptador que una subclase PagerAdapter

Un buen ejemplo se puede encontrar here

+1

En este ejemplo, los fragmentos y viewpager se mantienen en archivos xml separados. Quiero que ambos se mantengan en un solo archivo xml –

+0

¿Qué estás tratando de lograr? ¿Qué hay de la edición de su pregunta y agregar información que podamos encontrarle útil? – chip

+0

He actualizado la pregunta y el código. –

46

Puede usar un único diseño XML anidando las vistas secundarias.

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

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

     <LinearLayout 
      android:id="@+id/page_one" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" > 
        <TextView 
        android:text="PAGE ONE IN" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:textColor="#fff" 
        android:textSize="24dp"/> 
     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/page_two" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" > 
        <TextView 
        android:text="PAGE TWO IN" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:textColor="#fff" 
        android:textSize="24dp"/> 
     </LinearLayout> 

    </android.support.v4.view.ViewPager> 

</LinearLayout> 

PERO ... necesita manejar esto con un adaptador también. Aquí devolvemos la identificación de la vista finalizada sin inflar ningún otro diseño.

class WizardPagerAdapter extends PagerAdapter { 

     public Object instantiateItem(View collection, int position) { 

      int resId = 0; 
      switch (position) { 
      case 0: 
       resId = R.id.page_one; 
       break; 
      case 1: 
       resId = R.id.page_two; 
       break; 
      } 
      return findViewById(resId); 
     } 

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

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



    // Set the ViewPager adapter 
    WizardPagerAdapter adapter = new WizardPagerAdapter(); 
    ViewPager pager = (ViewPager) findViewById(R.id.pager); 
    pager.setAdapter(adapter); 

Mi pregunta es ... Algunos Guru aquí me puede enseñar si es posible que el ViewPager leer los niños de XML y concesionarios construir las páginas sin utilizar el instantiateItem()?

+9

Tendrá que reemplazar el método destroyItem: @ Override \t \t public void destroyItem (Ver arg0, int arg1, arg2 Object) {} \t \t – Kowlown

+0

que hizo que mi día Thnks alot !!!!!!!!!! – vnshetty

+1

para hacer que el niño se construya automáticamente puede agregar un constructor en el adaptador que toma el buscapersonas como parámetro. dentro del elemento instanciado, ahora puede devolver pager.getChildAt (posición); mientras que en getCount() puede devolver pager.getChildCount() –

2

eso es imposible .you puede hacerlo como éstos

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.view.ViewPager 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/pager" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 

continuación, crear el archivo XML separado y hacerlo como this.for por ejemplo: me va a utilizar el nombre del archivo XML es ios_frag.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:gravity="center" 
android:orientation="vertical" > 
<TextView 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="50sp"/> 
</LinearLayout> 
1

Simplemente si alguien enfrenta el mismo problema, lo he resuelto con un adaptador que extrae las vistas de página de un grupo de vistas arbitrario que le pasa.

package com.packagename; 

import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.View; 
import android.view.ViewGroup; 

import java.util.ArrayList; 
import java.util.List; 

public class ViewGroupPagerAdapter extends PagerAdapter { 
    public ViewGroupPagerAdapter(ViewGroup viewGroup) { 
     while (viewGroup.getChildCount() > 0) { 
      views.add(viewGroup.getChildAt(0)); 
      viewGroup.removeViewAt(0); 
     } 
    } 

    private List<View> views = new ArrayList<View>(); 

    @Override 
    public Object instantiateItem(ViewGroup parent, int position) { 
     View view = views.get(position); 
     ViewPager.LayoutParams lp = new ViewPager.LayoutParams(); 
     lp.width = ViewPager.LayoutParams.FILL_PARENT; 
     lp.height = ViewPager.LayoutParams.FILL_PARENT; 
     view.setLayoutParams(lp); 
     parent.addView(view); 
     return view; 
    } 

    @Override 
    public void destroyItem(ViewGroup parent, int position, Object object) { 
     View view = (View) object; 
     parent.removeView(view); 
    } 

    @Override 
    public int getCount() { 
     return views.size(); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == object; 
    } 
} 

Uso:

ViewPager viewPager=findViewById(...); // Retrieve the view pager 
viewPager.setAdapter(new ViewGroupPagerAdapter(findViewById(R.id.id_of_your_view_group_where_you_store_the_pages))); 
+0

¿Y cómo obtendría la vista actual en su actividad principal? – Denny

1

Usted puede subclase ViewPageronInflate y anular.
Además, obtendrá una vista previa de la primera página de ViewPager en el Editor de diseños.
Todas las vistas se guardan en la memoria, por lo que, por motivos de rendimiento, solo debe usar esto con un número reducido de páginas.

@Override protected void onFinishInflate() { 
    int childCount = getChildCount(); 
    final List<View> pages = new ArrayList<>(childCount); 
    for (int i = 0; i < childCount; i++) { 
     View child = getChildAt(i); 
     Class<?> clazz = child.getClass(); 
     if (clazz.getAnnotation(DecorView.class) == null) { 
      pages.add(child); 
     } 
    } 
    for (View page : pages) { 
     removeView(page); 
    } 
    setAdapter(new PagerAdapter() { 
     @Override public int getCount() { 
      return pages.size(); 
     } 

     @Override public Object instantiateItem(ViewGroup container, int position) { 
      container.addView(pages.get(position)); 
      return position; 
     } 

     @Override public void destroyItem(ViewGroup container, int position, Object object) { 
      container.removeView(pages.get((Integer)object)); 
     } 

     @Override public boolean isViewFromObject(View view, Object object) { 
      return pages.get((Integer)object) == view; 
     } 
    }); 
    super.onFinishInflate(); 
} 
0
viewPager = (ViewPager) rootView.findViewById(R.id.viewpager); 
    viewPager.setAdapter(new MyPagerAdapter(rootView)); 
    viewPager.setOffscreenPageLimit(3); //or whatever you like 

almacena en caché y muestra perfectamente.

Cuestiones relacionadas