我在一个活动中有一个listfragment,在按下一行时会打开一个dialogfragment以获取更多选项,现在我旋转设备并从dialogfragment中选择一个选项,它会抛出IllegalStateException ....片段没有附加。
choiceDialog
.setOnClickListDialogClickListener(new StandardListDialogFragment.OnClickListener<String>() {
@Override
public void onClick(DialogInterface dialog, int which,
String value) {
Intent intent = new Intent(this.getActivity(),
DutyEditor.class);
startActivityForResult(intent, 0);
dialog.dismiss();
}
});
答案 0 :(得分:2)
发生这种情况是因为只要方向发生变化,片段就会被破坏并使用FragmentManager重新创建。
使用碎片时,您应该遵守这些规则
最好的选择是在DialogFragment本身中调用startActivityForResult()。
但是,只要您确实需要将DialogFragment单击事件传递给Activity,请使用Interface。例如。
public final class SomeDialogFragment extends DialogFragment {
/**
* Callbacks of {@link SomeDialogFragment}
*/
public interface SomeDialogFragmentCallbacks {
/**
* Called when user pressed some button
*/
void onSomeButtonClick();
}
@Override
public void onAttach(final Activity activity) {
super.onAttach(activity);
// Make sure the Activity can receive callbacks
if (!(activity instanceof SomeDialogFragmentCallbacks)) {
throw new RuntimeException("Should be attached only to SomeDialogFragmentCallbacks");
}
}
// now whenever a button is clicked
@Override
public void onClick(DialogInterface dialog, int which) {
final SomeDialogFragmentCallbacks callbacks = (SomeDialogFragmentCallbacks) getActivity();
if (callbacks != null) {
callbacks.onSomeButtonClick();
}
}
}
使用此DialogFragment的所有活动都应该实现回调方法。
public final class SomeActivity extends Activity implements SomeDialogFragmentCallbacks {
@Override
public void onSomeButtonClick() {
// Handle some DialogFragment button click here
}
}