EDIT: Не помилка, а більший недолік у структурі фрагментів. Кращою відповіддю на це питання є відповідь, надана @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()
замість цього слід використовувати .