EDITAR: No es un error, sino más bien una deficiencia en el marco de fragmentos. La mejor respuesta a esta pregunta es la proporcionada por @Arcao arriba.
---- Publicación original ----
En realidad, es un error conocido con el paquete de soporte (editar: en realidad no es un error. Ver el comentario de @ alex-lockwood). Una solución alternativa publicada en los comentarios del informe de error es modificar la fuente del DialogFragment de esta manera:
public int show(FragmentTransaction transaction, String tag) {
return show(transaction, tag, false);
}
public int show(FragmentTransaction transaction, String tag, boolean allowStateLoss) {
transaction.add(this, tag);
mRemoved = false;
mBackStackId = allowStateLoss ? transaction.commitAllowingStateLoss() : transaction.commit();
return mBackStackId;
}
Tenga en cuenta que este es un truco gigante. La forma en que realmente lo hice fue crear mi propio fragmento de diálogo con el que pudiera registrarme desde el fragmento original. Cuando ese otro fragmento de diálogo hizo cosas (como ser descartado), le dijo a los oyentes que se iba. Lo hice así:
public static class PlayerPasswordFragment extends DialogFragment{
Player toJoin;
EditText passwordEdit;
Button okButton;
PlayerListFragment playerListFragment = null;
public void onCreate(Bundle icicle){
super.onCreate(icicle);
toJoin = Player.unbundle(getArguments());
Log.d(TAG, "Player id in PasswordFragment: " + toJoin.getId());
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle){
View v = inflater.inflate(R.layout.player_password, container, false);
passwordEdit = (EditText)v.findViewById(R.id.player_password_edit);
okButton = (Button)v.findViewById(R.id.ok_button);
okButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
passwordEntered();
}
});
getDialog().setTitle(R.string.password_required);
return v;
}
public void passwordEntered(){
playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString());
dismiss();
}
public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){
this.playerListFragment = playerListFragment;
}
public void unregisterPasswordEnteredListener(){
this.playerListFragment = null;
}
}
Así que ahora tengo una forma de notificar al PlayerListFragment cuando suceden cosas. Tenga en cuenta que es muy importante que llame a unregisterPasswordEnteredListener de manera adecuada (en el caso anterior, cuando el PlayerListFragment "desaparece"), de lo contrario, este fragmento de diálogo podría intentar llamar a funciones en el oyente registrado cuando ese oyente ya no existe.
onResumeFragments()
no existe en laActivity
clase. Si está utilizando un básicoActivity
, debería utilizaronPostResume()
en su lugar.