设备方向更改后,片段会抛出IllegalStateException

时间:2014-10-10 13:09:47

标签: android android-fragments android-listfragment

我在一个活动中有一个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();
                }
            });

1 个答案:

答案 0 :(得分:2)

发生这种情况是因为只要方向发生变化,片段就会被破坏并使用FragmentManager重新创建。

使用碎片时,您应该遵守这些规则

  • 使用碎片时避免使用设置器。
  • 永远不要对活动中的片段进行字段引用。
  • 你可以在onAttach()之后和onDetach()之前保存对片段上的Activity的字段引用,但我发现最好调用getActivity()并在每次需要它时进行短操作检查null。 LI>

最好的选择是在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
    }

}