DÜZENLEME: Bir hata değil, daha çok fragment çerçevesindeki bir eksiklik. Bu soruya daha iyi cevap, yukarıda @Arcao tarafından verilen cevaptır.
---- Orijinal gönderi ---
Aslında bu , destek paketiyle ilgili bilinen bir hatadır (düzenleme: aslında bir hata değildir. @ Alex-lockwood'un yorumuna bakın). Hata raporunun yorumlarında yayınlanan bir çalışma, DialogFragment'ın kaynağını şu şekilde değiştirmektir:
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;
}
Bunun dev bir hack olduğunu unutmayın. Aslında yaptığım yol, orijinal parçadan kayıt yapabileceğim kendi diyalog parçamı yapmaktı. Diğer diyalog parçası bir şeyler yaptığında (göz ardı edilmek gibi), herhangi bir dinleyiciye onun uzaklaştığını söyledi. Ben böyle yaptım:
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;
}
}
Artık işler olduğunda PlayerListFragment'ı bilgilendirmek için bir yolum var. UnregisterPasswordEnteredListener'ı uygun bir şekilde çağırmanızın çok önemli olduğuna dikkat edin (yukarıdaki durumda PlayerListFragment "kaybolduğunda"), aksi takdirde bu iletişim kutusu parçası, o dinleyici artık mevcut olmadığında kayıtlı dinleyicide işlevleri çağırmayı deneyebilir.
onResumeFragments()olmadığını unutmayınActivity. Temel kullanıyorsanızActivity,onPostResume()bunun yerine kullanmalısınız .