He desarrollado una aplicación en nido de abeja y la estoy usando fragmentos.

Esta es mi app

  • Tengo una Actividad (Digamos A1) y en la que hay un fragmento
  • Inicialmente este fragmento sostenga el objeto de un fragmento de objeto a decir (F1)
  • A continuación, dependiendo de las acciones del usuario se puede cambiar a otros objetos F2,F3 ….

Lo que mi problema es

Cuando El usuario gira el dispositivo de la actividad es recreado y que hacen de la F1, como el fragmento de objeto, incluso a pesar de que antes de la rotación no fue

What is the way to retain the fragment object while rotating?

He utilizado setRetainInstance(true); pero no funcionó para mí

Y he añadido el fragmento de código en mi onCreate función como esta

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

   FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();

   Fragment homeFragment = new Home();
   fragmentTransaction.add(R.id.mainFragement, homeFragment);
   fragmentTransaction.commit();
}
InformationsquelleAutor Jithin | 2011-03-02

6 Comentarios

  1. 63

    Por defecto de Android podrán retener el fragmento de objetos. En el código se establece el homeFragment en su onCreate función. Es por eso que es siempre algunas homeFragment o fl lo que se establece en onCreate.

    Porque cada vez que gire, el onCreate se va a ejecutar y establecer su fragmento de objeto a la primera

    Por lo que la solución fácil para usted es comprobar si savedInstanceState paquete es null o no y establecer el fragmento de objeto

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        if(null == savedInstanceState) {
            //set you initial fragment object 
        }
     }
    • ¿qué debo hacer en el caso de utilizar una actividad con ViewPager que se encarga de los fragmentos?
    • rezar. No, en serio, yo lo que hice fue: super.onCreate(null);
    • «Por defecto de android podrán retener el fragmento de objetos» … no es cierto. Android va a crear nuevos objetos en los cambios de orientación, a menos que setRetainInstance(true) se llama. No hay que confundir esto con Android automáticamente volver a unir los fragmentos. No son la misma cosa. Verificación de las huellas reportado por S. D. en la esta respuesta.
  2. 38

    Que usted necesita para darle a su Fragmento de una etiqueta única, y comprobar si este Fragmento ya está añadido a su Actividad ya o no.

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String tag = "my_fragment";
        FragmentManager fragmentManager = getFragmentManager();
        if(fragmentManager.findFragmentByTag(tag) == null) {
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            Fragment homeFragment = new Home();
            fragmentTransaction.add(R.id.mainFragement, homeFragment, tag);
            fragmentTransaction.commit();
        }
    }

    Comprobar si savedInstanceState es nulo no es una manera segura para comprobar si el fragmento es ya – funcionará en la mayoría de los casos, pero en algunos casos (como cuando el dispositivo está en la memoria baja), Android, puede matar a su Actividad, lo que podría romper su aplicación.

    Para ver esto en acción, marque «no mantener actividades» en el dispositivo opciones de desarrollo (la opción está disponible en Android 4.0+, no estoy seguro acerca de las versiones anteriores). Cuando se abre una nueva actividad, la primera actividad es destruido. Al regresar a la misma (pulsando back), es creado de nuevo, y savedInstanceState es no null. Sin embargo, el fragmento no es en la actividad más, y usted tiene que agregar de nuevo.

    De EDICIÓN que Muestra el principio original pero con SupportFragmentManager

    public class ActivityAwesome extends AppCompatActivity
    {
        private final String TAG = getClass().getSimpleName();
        private FragmentHome mHomeFragment;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_layout);
    
            FragmentManager fragmentManager = getSupportFragmentManager();
            Fragment fragment = fragmentManager.findFragmentByTag(TAG);
            if(fragment == null)
            {
                //Create the detail fragment and add it to the activity using a fragment transaction.
                mHomeFragment = new FragmentHome();
                fragmentManager.beginTransaction()
                        .add(R.id.fragment_container, mHomeFragment, TAG)
                        .commit();
            }
            else
            {
                //get our old fragment back !
                mHomeFragment = (FragmentHome)fragment;
            }
        }
    }

    esto es especialmente útil si desea manipular el fragmento (en este caso mHomeFragment) después de la rotación de su dispositivo

    • Aunque yo he usado la respuesta proporcionada por @labeeb antes, creo que la comprobación de la única tag es el mejor enfoque.
    • muy interesante ! Parece entonces que Google necesita para actualizar su código de la plantilla.
  3. 3

    Uso onAttachFragment() en su Activity para reasignar el objeto de:

    @Override
    public void onAttachFragment(Fragment fragment) {
        if (fragment instanceof MyFragment)
            this.myFragment = (MyFragment) fragment;
    }
  4. 0

    He definido un Fragment en la actividad del diseño, onSaveInstanceState en el Fragment no se llama, pero la savedInstanceState Bundle en el Fragmento del onCreatView viene como null.

    La razón era que mi Fragment no tiene un ID en XML:

    android:id="@+id/compass_fragment" ...
  5. 0

    sólo recableado @Ralf respuesta más dinámica, sin necesidad de especificar un determinado fragmento de mantener, pero en caso de que desee especificar, también es posible :

     public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //set Home/Main/default fragment
            changeFragmentTo(HomeFragment.newInstance(), FRAGMENT_TAG_HOME_FRAGMENT);
    
    
            if (getCurrentFragment() != null) {
                //if screen rotated retain Fragment
                changeFragmentTo(getCurrentFragment(), getCurrentFragment().getTag());
    
            }
    
        }
    
    
        private Fragment getCurrentFragment() {
    //fl_main_container is FarmeLayout where I load my Fragments
            return getSupportFragmentManager().findFragmentById(R.id
                    .fl_main_container);
        }
    
    
    
        /**
         * changeFragmentTo(Fragment fragmentToLoad, String fragmentTag)
         *
         * @param fragmentToLoad : dataType > v4.app.Fragment :: the object of the fragment you want to load in form of MyFragment() or MyFragment().newInstance()
         * @param fragmentTag    :  dataType > String :: a String which identify the "tag" of the fragment in form of "FRAGMENT_TAG_MY_FRAGMENT", Value must be stored in {@link models.MyConstants}
         */
    
    
        public void changeFragmentTo(Fragment fragmentToLoad, String fragmentTag) {
    
            if (getSupportFragmentManager().findFragmentByTag(fragmentTag) == null) {
                getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.fl_main_container, fragmentToLoad, fragmentTag)
                        .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                        .addToBackStack(fragmentTag)
                        .commit();
    
            } else {
                getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.fl_main_container, fragmentToLoad, fragmentTag)
                        .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                        .commit();
            }
        }
    
    
    
    }

Dejar respuesta

Please enter your comment!
Please enter your name here