EDIT: Kein Fehler, sondern eher ein Mangel im Fragment-Framework. Die bessere Antwort auf diese Frage ist die von @Arcao oben.
---- Originaler Beitrag ----
Eigentlich ist es ein bekannter Fehler mit dem Support-Paket (bearbeiten: eigentlich kein Fehler. Siehe @ alex-lockwoods Kommentar). Eine in den Kommentaren des Fehlerberichts veröffentlichte Problemumgehung besteht darin, die Quelle des DialogFragments wie folgt zu ändern:
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;
}
Beachten Sie, dass dies ein riesiger Hack ist. So wie ich es tatsächlich gemacht habe, habe ich einfach mein eigenes Dialogfragment erstellt, bei dem ich mich aus dem Originalfragment registrieren konnte. Wenn dieses andere Dialogfragment Dinge tat (wie entlassen werden), sagte es allen Zuhörern, dass es verschwinden würde. Ich habe es so gemacht:
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(){
//TODO handle if they didn't type anything in
playerListFragment.joinPlayer(toJoin, passwordEdit.getText().toString());
dismiss();
}
public void registerPasswordEnteredListener(PlayerListFragment playerListFragment){
this.playerListFragment = playerListFragment;
}
public void unregisterPasswordEnteredListener(){
this.playerListFragment = null;
}
}
Jetzt habe ich eine Möglichkeit, das PlayerListFragment zu benachrichtigen, wenn etwas passiert. Beachten Sie, dass es sehr wichtig ist, dass Sie unregisterPasswordEnteredListener entsprechend aufrufen (im obigen Fall, wenn das PlayerListFragment "verschwindet"). Andernfalls versucht dieses Dialogfragment möglicherweise, Funktionen für den registrierten Listener aufzurufen, wenn dieser Listener nicht mehr vorhanden ist.
onResumeFragments()
dies in derActivity
Klasse nicht vorhanden ist . Wenn Sie ein Basic verwendenActivity
, sollten SieonPostResume()
stattdessen verwenden.