편집 : 버그는 아니지만 조각 프레임 워크의 결함이 더 많습니다. 이 질문에 대한 더 나은 대답은 위의 @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()
대신 사용해야 합니다.