CHỈNH SỬA: Không phải lỗi, mà là do thiếu sót trong khung phân đoạn. Câu trả lời tốt hơn cho câu hỏi này là câu trả lời được cung cấp bởi @Arcao ở trên.
---- Bài gốc ----
Trên thực tế, đó là một lỗi đã biết với gói hỗ trợ (chỉnh sửa: không thực sự là một lỗi. Xem nhận xét của @ alex-lockwood). Một công việc được đăng xung quanh các nhận xét của báo cáo lỗi là sửa đổi nguồn của DialogFragment như sau:
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;
}
Lưu ý đây là một vụ hack khổng lồ. Cách tôi thực sự đã làm là chỉ tạo một đoạn hộp thoại của riêng tôi mà tôi có thể đăng ký từ đoạn gốc. Khi đoạn hộp thoại khác đó thực hiện những điều (như bị loại bỏ), nó nói với bất kỳ người nghe nào rằng nó sẽ biến mất. Tôi đã làm nó như thế này:
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;
}
}
Vì vậy, bây giờ tôi có một cách để thông báo cho PlayerListFragment khi sự việc xảy ra. Lưu ý rằng điều rất quan trọng là bạn phải gọi unregisterPasswordEnteredListener một cách thích hợp (trong trường hợp trên là khi PlayerListFragment "biến mất") nếu không phân đoạn hộp thoại này có thể cố gắng gọi các hàm trên trình nghe đã đăng ký khi trình nghe đó không còn tồn tại nữa.
onResumeFragments()
không tồn tại trongActivity
lớp. Nếu bạn đang sử dụng cơ bảnActivity
, bạn nên sử dụngonPostResume()
thay thế.