2012-04-02 21 views
6

Actualmente estoy tratando de crear un marco para mis futuras aplicaciones. Me gusta mucho el ActionBar y el ViewPager, pero extraño una característica. Necesito reemplazar un Fragmento/Pestaña en tiempo de ejecución.Reemplazo de un Fragmento/Pestaña en un Viewpager

Usando el example oficial, me gustaría ver algo así como un replaceTab(), pero el Fragmento en sí mismo no se actualiza, no importa lo que haga.

Respuesta

1

¿Trata:

fragmentTransaction.remove(yourframent); 

y luego:

fragmentTransaction.add(yournewfragment); 
0

Muy cerca de lo que quiere, que tenía que añadir fragmento (al final) a un ViewPager, e hizo esto:

FragmentTransaction ft = fragmentManager.beginTransaction(); 
    new_fragment = Fragment.instantiate(activity, class_name, args); 

    // The below code removes old fragment and adds the new one at the end. 
    ft.attach(new_fragment);    // <- this adds the fragment at the end 
    ft.detach(old_fragment);    // <- this removes old fragment 

    // This should be what you're looking for when adding to an Activity instead of a ViewPager 
    ft.replace(view_id, new_fragment); // <- this is supposed to replace the fragment attached to view_id 

    // Or if the replace does not work, this might work: 
    ft.detach(old_fragment); 
    ft.add(view_id, new_fragment); 

    // Not to be forgotten: ;) 
    ft.commit(); 

El código anterior podría necesitar algunos ajustes, puede que sólo requieren la reemplazar llamada para trabajar efectivamente?

Si falla la llamada de reemplazo, aún puede separar todos los fragmentos y volverlos a colocar en el orden deseado.

2

Tienes que usar un FragmentPagerAdapter para manejar tus cambios de fragmento. Hay 3 cosas importantes:

  • elimine el fragmento anterior si existe.

  • llamada notifyDataSetChanged() para actualizar la lista de páginas.

  • devuelve POSITION_NONE en getItemPosition si está pidiendo un fragmento antiguo.

Aquí está el código que uso con una página izquierda y una derecha. Cambio dinámicamente los fragmentos según lo que haga el usuario.

public class MyPager extends ViewPager { 

    private MyPagerAdapter mMyPagerAdapter; 

    public MyPager(Context context, FragmentActivity activity) { 
     super(context); 

     mMyPagerAdapter = new MyPagerAdapter(activity.getSupportFragmentManager()); 
     setAdapter(mMyPagerAdapter); 

    } 
    public void replaceLeftFragment(Fragment fragment) { 
     mMyPagerAdapter.replaceLeftFragment(fragment); 
    } 
    public void replaceRightFragment(Fragment fragment) { 
     mMyPagerAdapter.replaceRightFragment(fragment); 
    } 
} 

public class MyPagerAdapter extends FragmentPagerAdapter { 

    private FragmentManager mFragmentManager; 
    private Fragment mLeftFragment; 
    private Fragment mRightFragment; 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
     mFragmentManager = fm; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     if (position == 0) { 
      return mLeftFragment; 
     } else { 
      return mRightFragment; 
     } 
    } 

    @Override 
    public int getCount() { 
     final int nbLeft = (mLeftFragment == null) ? 0 : 1; 
     final int nbRight = (mRightFragment == null) ? 0 : 1; 
     return (nbLeft + nbRight); 
    } 

    public void replaceLeftFragment(Fragment fragment) { 
     if (mLeftFragment != null) { 
      mFragmentManager.beginTransaction().remove(mLeftFragment).commit(); 
     } 
     mLeftFragment = fragment; 
     notifyDataSetChanged(); 
    } 
    public void replaceRightFragment(Fragment fragment) { 
     if (mRightFragment != null) { 
      mFragmentManager.beginTransaction().remove(mRightFragment).commit(); 
     } 
     mRightFragment = fragment; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     if ((object!=mLeftFragment) && (object!=mRightFragment)) { 
      return POSITION_NONE; 
     } 
     return super.getItemPosition(object); 
    } 

} 
Cuestiones relacionadas