2012-03-05 10 views
18

Estoy tratando de usar el Fragmento, ViewPager & co. de la biblioteca de soporte de Android v4. Los fragmentos parecen desplazarse cuando escucho eventos de cambio de página desde el buscapersonas pero el contenido no está visible. Lo que básicamente tengo es:ViewPager con FragmentPagerAdapter no muestra contenido

Un FragmentActivity:

public class MyActivity extends FragmentActivity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     FragmentPagerAdapter fpa = new MyPagerAdapter(this, createFragments()); 

     ViewPager vp = (ViewPager) findViewById(R.id.pager); 
     vp.setAdapter(fpa); 
    } 

    private List<Fragment> createFragments() { 
     List<Fragment> list = new ArrayList<Fragment>(); 
     list.add(Fragment.instantiate(this, First.class.getName())); 
     list.add(Fragment.instantiate(this, Second.class.getName())); 
     list.add(Fragment.instantiate(this, Third.class.getName())); 

     return list; 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 

    } 

Un FragmentPagerAdapter:

public class MyPagerAdapter extends FragmentPagerAdapter { 
    private List<Fragment> fragments; 

    public MyPagerAdapter(FragmentActivity activity, List<Fragment> fragments) { 
     super(activity.getSupportFragmentManager()); 
     this.fragments = fragments; 
    } 

    @Override 
    public Fragment getItem(int i) { 
     return fragments.get(i); 
    } 

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

    @Override 
    public boolean isViewFromObject(View view, Object o) { 
     return view.equals(o); 
    } 

} 

Y tres fragmentos que se ven así:

public class First extends Fragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.first, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 
} 

Y tienen el diseño como estos:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
    <TextView android:layout_height="fill_parent" 
       android:layout_width="fill_parent" 
       android:text="First Fragment" 
       android:id="@+id/firstText"/> 
</LinearLayout> 

originalmente se me olvidó añadir el diseño principal, aquí se trata:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <android.support.v4.view.ViewPager 
      android:id="@+id/pager" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:layout_width="fill_parent"/> 
</LinearLayout> 

Le agradecería si alguien me puede decir lo que estoy haciendo mal.

+0

podría ofrecerle la disposición que contiene el ViewPager? ¿Has puesto un punto de interrupción en getItem() solo para asegurarte de que está disparando? Además, establezca textcolor en blanco en esas textviews solo para asegurarse! –

+0

oh sí, agregó que ahora. – rgngl

+0

Su viewpager tiene su altura establecida para envolver el contenido, y sus páginas tienen su altura configurada para llenar el elemento principal; esto no tiene sentido y probablemente signifique que sus páginas no ocupen espacio. Sospecho que quieres que el viewpager tenga una altura de fill_parent también. –

Respuesta

38

Esto se debe a que ha anulado isViewFromObject en MyPagerAdapter.

FragmentPagerAdapter maneja isViewFromObject, por lo que no deberías anularlo.

Al igual que yo, creo que la mayoría de los visitantes de esta publicación comenzaron con un PagerAdapter básico, luego se dieron cuenta de que necesitaban paginar los fragmentos y cambiar su clase base sin darse cuenta de las consecuencias. Desafortunado, pero no pude criticar al equipo de Android por esto.

+1

Cambié de un simple PagerAdapter a un FragmentPagerAdapter y no me di cuenta de este problema. Muchas gracias. – zgc7009

+0

¡guardas el día! –

+0

salvavidas, no encuentro esta información en ningún otro lado ...! –

1

Ya correcta como Ian Newson dijo, basta con retirar método overrided isViewFromObject a partir del código

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