编辑:不是错误,而是片段框架中的更多缺陷。这个问题的更好答案是上面@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;
}
请注意,这是一个巨大的hack。实际上,我只是通过自己的对话框片段来注册原始片段。当其他对话片段执行某项操作(例如被驳回)时,它告诉所有听众它即将消失。我这样做是这样的:
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
。如果您使用的是basicActivity
,则应该使用onPostResume()
。