РЕДАКТИРОВАТЬ: Не ошибка, а скорее недостаток в структуре фрагментов. Лучший ответ на этот вопрос дает @Arcao выше.
---- Оригинальный пост ----
На самом деле это известная ошибка в пакете поддержки (правка: на самом деле это не ошибка. См. Комментарий @ alex-lockwood). Опубликованная работа в комментариях к отчету об ошибке заключается в изменении источника DialogFragment следующим образом:
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;
}
Обратите внимание, что это гигантский взлом. На самом деле я просто сделал свой собственный фрагмент диалога, который я мог зарегистрировать из исходного фрагмента. Когда этот другой фрагмент диалога сделал что-то (например, был отклонен), он сказал всем слушателям, что он уходит. У меня так получилось:
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;
}
}
Итак, теперь у меня есть способ уведомлять PlayerListFragment, когда что-то происходит. Обратите внимание, что очень важно, чтобы вы вызывали unregisterPasswordEnteredListener соответствующим образом (в приведенном выше случае, когда PlayerListFragment «исчезает»), иначе этот фрагмент диалога может попытаться вызвать функции зарегистрированного слушателя, когда этот слушатель больше не существует.
onResumeFragments()
этого не существует вActivity
классе. Если вы используете базовыйActivity
, вам следует использоватьonPostResume()
вместо него.