Fragmento en la rotación de la pantalla

He añadido un viewpager a una actividad que contiene dos páginas.

En onCreate de actividad agrego fragmentos a un fragmentoAdapter:

public void onCreate(Bundle savedInstanceState) { ...... FragmentAdapter fragmentAdapter = new FragmentAdapter ( getSupportFragmentManager(), new Fragment[]{FragmentGame.builder(id), FragmentComments.builder(id)}, new String[]{getString(R.string.gameInfo), getString(R.string.comments)} ); ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager); viewPager.setAdapter(fragmentAdapter); public static FragmentGame builder(long id) { FragmentGame fragmentGame = new FragmentGame(); // fragmentGame.id = id; Bundle bundle = new Bundle(); bundle.putLong(Constants.EXTRA_ID, id); fragmentGame.setArguments(bundle); return fragmentGame; } 

La primera vez que se crea la actividad onCreateView de fragmento se llama como se espera.

El comportamiento extraño es cuando se gira la pantalla por primera vez el onCreateView de fragmento se llama dos veces, pero la segunda llamada sólo tiene la id correcta y para la primera llamada id es 0.

En la segunda rotación de la pantalla, onCreateView se llama tres veces y nuevamente sólo el último tiene id.

Con más rotación de la pantalla, aumentan las llamadas onCreateView .

He encontrado alguna pregunta relacionada sobre el fragmento y la rotación de la pantalla, pero no puedo entender por qué sucede esto y cómo hacerlo de la manera correcta.

—– ACTUALIZACIÓN ——

El problema de identificación se resuelve cuando he reemplazado el paquete con el ajuste de valor directo.

Cada vez que gira el dispositivo, está creando un nuevo fragmento y agregándolo al FragmentManager.

Todos los fragmentos creados anteriormente están todavía en el FragmentManager, por lo tanto, el recuento aumenta en uno cada vez.

Si desea conservar un valor en su fragmento, debe almacenarlo en los argumentos, de lo contrario cualquier valor que contenga se perdería cuando el sistema recree el fragmento.

 public static FragmentGame builder(long id) { Bundle args = new Bundle(); args.putInt("id", id); fragmentGame f = new fragmentGame(); f.setArguments(args); } 

En lugar de crear un nuevo fragmento, sospecho que realmente desea recuperar su creado anteriormente al girar el dispositivo. Utilice getSupportFragmentManager().findFragmentById() o getSupportFragmentManager().findFragmentByTag() para hacer esto.

Editar: Código extra

  // Add fragment to the manager FragmentTransaction trans=getSupportFragmentManager().beginTransaction(); trans.add(f,"myTag"); trans.commit(); // retrieve the fragment Fragment f= getSupportFragmentManager().findFragmentByTag("myTag"); 

Sólo intenta recuperar el fragmento, si el valor es nulo, crear un nuevo fragmento y añadirlo al gestor de lo contrario utilizar el recuperado.

Si no desea volver a cargar el fragmento en el cambio de orientación, escriba a continuación para la actividad en la que está cargando el fragmento en el archivo de manifiesto.

 <activity android:name="your activity name" android:configChanges="orientation|screenSize" // add this to your activity android:label="@string/app_name"> </activity> 
  • Got "java.lang.IllegalStateException: Fragmento ya activo" cuando el diseño no está vacío
  • Cómo colocar el botón de acción flotante exclusivamente en un fragmento sólo en el diseño de la pestaña
  • Devoluciones de llamadas de la fragmentación de Android
  • ¿Es posible arrastrar el elemento fuera de RecyclerView?
  • Evitar el siguiente fragmento (pestaña) de la precarga con ViewPager
  • Asynctask en Fragmento o actividad de los padres?
  • Cargar sólo un fragmento en ViewPager
  • Android Fragment getArguments () devuelve null
  • Disposición de restricción beta 4 - los fragmentos no funcionan
  • Fragmentos todavía agregados a backstack sin llamar addToBackStack, ¿por qué?
  • No puedo envolver mi cabeza alrededor de Android Fragments
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.