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

阿兹玛特

我在活动中有一个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();
                }
            });
雅罗斯拉夫·梅特卡利克(Yaroslav Mytkalyk)

发生这种情况的原因是,每当方向发生更改时,就会损坏Fragment并使用FragmentManager重新创建。

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

  • 使用片段时,避免使用setter。
  • 切勿在活动中保留对片段的字段引用。
  • 您可以在onAttach()之后和onDetach()之前在Fragment上保留对片段上Activity的字段引用,但是我发现最好调用getActivity()并在每次我需要短时间操作时都检查它是否为null。

最好的选择是在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的Activity都应实现回调方法。

public final class SomeActivity extends Activity implements SomeDialogFragmentCallbacks {

    @Override
    public void onSomeButtonClick() {
        // Handle some DialogFragment button click here
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章