tutorial studio propiedades fragments example ejemplo dinamicos container android android-fragments android-fragmentactivity

fragments - propiedades de fragment en android studio



Traer el fragmento al frente(sin recreación del fragmento) (5)

  1. Use un ArrayList<Fragment> simple para sus Fragmentos y agréguelos en orden, para que sepa que get (0) obtendrá F1, get (1) obtiene F2, etc.

  2. Crea los Fragmentos como singletons. En cada fragmento agregue un campo y método estático:

    private static Fragment mMyInstance = null; public static Fragment newInstance() { if (mMyInstance == null) { mMyInstance = new F1(); } return mMyInstance; }

  3. Cree los fragmentos con el método estático y agréguelos a ArrayList.

  4. En cada Fragmento agregue setRetainInstance(true); comando al método onCreate ()

Ahora, cuando agrega el Fragmento con el FragmentManager, onCreate() solo se llamará la primera vez, pero se onCreateView() cada vez. Desea inflar la vista y conectar los widgets cada vez, en caso de que su actividad se haya recreado debido a un cambio de configuración. Pero puede verificar algo que agregue para ver si es la primera vez o no, y restablecer los widgets a su estado anterior, si no. Por lo tanto, necesitarás variables miembro en tus Fragmentos para mantener un registro de su estado. Reemplace onStop () para guardar el estado y vuelva a aplicarlo en onCreateView () después de conectar los widgets.

Luego, cuando se presiona el botón de la barra lateral, obtiene el Fragmento que corresponde a ese botón, elimina el Fragmento anterior y agrega el actual con FragmentManager (o simplemente usa el comando replace () en lugar de eliminar () / add ()) .

Tengo tres fragmentos F1 F2 F3 F4 todos accesibles desde la barra lateral.

Los cuatro pueden ser llamados en cualquier momento y en cualquier orden.

Ahora quiero que si F1 ya se ha hecho clic (creado), nunca más vuelva a crear F1, sino que solo vuelva a traer el fragmento F1 al frente con el administrador de fragmentos. Lo mismo para todos los demás fragmentos.

Hasta ahora he intentado esto para cada fragmento en mi contenedor (ACTIVIDAD DE FRAGMENTO)

if (fragmentManager.findFragmentByTag("apps")==null) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); Fragment newFragment = new CategoriesFragment(); transaction.replace(R.id.content_frame, newFragment, "apps"); transaction.addToBackStack("apps"); transaction.commit(); } else{ }

If parte me garantiza que NO se vuelve a crear NINGÚN fragmento (si ya se ha creado), pero ¿qué debo escribir en la parte else para que el fragmento ya creado pueda aparecer al frente en la jerarquía de vistas?

Por favor ayuda, estoy atascado en esto por 2 días.


Obtenga el fragmento por etiqueta y reemplácelo en el contenedor,

else{ Fragment existingFragment = (CategoriesFragment)fragmentManager.findFragmentByTag("apps"); transaction.replace(R.id.content_frame,existingFragment, "apps"); transaction.addToBackStack("apps"); transaction.commit(); }

ACTUALIZACIÓN: puede usar ocultar y mostrar fragmentos para evitar la recreación. En lugar de usar "transaction.replace ()"

fragmentTransaction.hide(<oldFragment>); fragmentTransaction.show(<newFragment>);


Si está utilizando el Fragmento de soporte, este método estático hace el trabajo.

/** * Takes a Fragment TAG and tries to find the fragment in the manager if it exists and bring it to front. * if not, will return false; * @param manager * @param tag */ public static boolean resurfaceFragment(FragmentManager manager, String tag ){ Fragment fragment = manager.findFragmentByTag(tag); FragmentTransaction transaction = manager.beginTransaction(); if (fragment!=null){ for (int i = 0; i < manager.getFragments().size(); i++) { Fragment f = manager.getFragments().get(i); transaction.hide(f); } transaction.show(fragment).commit(); return true; } return false; }


Si solo intentas agregar un Fragment sin tener que preocuparte por recrearlo, creo que este método que escribí para agregar Fragment te ayudará.

public static void attachFragment ( int fragmentHolderLayoutId, Fragment fragment, Context context, String tag ) { FragmentManager manager = ( (AppCompatActivity) context ).getSupportFragmentManager (); manager.findFragmentByTag ( tag ); FragmentTransaction ft = manager.beginTransaction (); if (manager.findFragmentByTag ( tag ) == null) { // No fragment in backStack with same tag.. ft.add ( fragmentHolderLayoutId, fragment, tag ); ft.addToBackStack ( tag ); ft.commit (); } else { ft.show ( manager.findFragmentByTag ( tag ) ).commit (); } }


Yo pondría este código en la clase de actividad, que debe tener FrameLayout con id R.id.fragment_container .

private Fragment1 F1; private Fragment2 F2; private Fragment3 F3; private Fragment4 F4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); F1 = new Fragment1(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F1).commit(); F2 = new Fragment2(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F2).commit(); F3 = new Fragment3(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F3).commit(); F4 = new Fragment4(); getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F4).commit(); //if needed show F1 getSupportFragmentManager().beginTransaction().show(F1).commit(); }

Y agrega esto para hacer clic en el botón:

public void onBtnClick(View view){ if(mShowF1){ getSupportFragmentManager().beginTransaction().show(F1).commit(); getSupportFragmentManager().beginTransaction().hide(F2).commit(); getSupportFragmentManager().beginTransaction().hide(F3).commit(); getSupportFragmentManager().beginTransaction().hide(F4).commit(); } //... }

Al hacer clic en el botón (s), puede mostrar el fragmento que desea y ocultar otros.

NOTA (@ developer1011): para usar después del estado de guardado de actividad, se llama a commitAllowingStateLoss () . Se usa con cuidado, porque el fragmento no se restaura con la restauración de la actividad.

NOTA: MainActivity debe implementar OnFragmentInteractionListener para cada Fragmento.

public class MainActivity extends FragmentActivity implements Fragment1.OnFragmentInteractionListener, Fragment2.OnFragmentInteractionListener, Fragment3.OnFragmentInteractionListener, Fragment4.OnFragmentInteractionListener {//.. @Override public void onFragmentInteraction(Uri uri) { // } }