Problema:mChildFrgamentManager
sia ricreata (https://code.google.com/p/android/issues/detail?id=74222)
Soluzione: ritegno mChildFrgamentManager
se frammento ha setRetainInstance(true)
:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (getRetainInstance()) {
if (mRetainedChildFragmentManager != null) {
try {
Field childFMField = Fragment.class.getDeclaredField("mChildFragmentManager");
childFMField.setAccessible(true);
childFMField.set(this, mRetainedChildFragmentManager);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
mRetainedChildFragmentManager = getChildFragmentManager();
}
}
}
Attenzione: Con questo codice, setRetainInstace
dovrebbe essere chiamato prima onAttach
.
P.S: Questa è una versione leggermente migliorata della risposta di @attels.
Huh. Non ricevo un'eccezione come te. Per me, onCreateView nel genitore ottiene semplicemente un nuovo frammento figlio da findFragmentById. Il che significa che deve essere reinizializzato, il che è molto lento nel caso di un Google MapFragment. :( – aij
Si prega di notare che, questo non è più un problema dopo la correzione in https://code.google.com/p/android/issues/detail?id=197271 –
È rilasciato nella libreria di supporto 24 –