編集:バグではありませんが、フラグメントフレームワークのより多くの欠陥です。この質問に対するより良い答えは、上記の@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()
代わりにを使用する必要があります。