首页 > 解决方案 > Illegalstateexception Fragment 必须是公共静态类才能从实例状态正确重新创建

问题描述

下面是抛出错误消息的代码

java.lang.illegal 状态异常:片段必须是公共静态类才能从实例状态正确重新创建

**compile 'com.google.android.gms:play-services-ads:11.8.0'只有在我将** 包含在 build.gradle 文件中之后,以下代码片段才会引发错误,否则工作正常。

public void selectDate(View view) {
            DialogFragment newFragment = new SelectDateFragment();
            newFragment.show(getFragmentManager(), "DatePicker");
        }

@SuppressLint("ValidFragment")
public class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                final Calendar calendar = Calendar.getInstance();
                int yy = calendar.get(Calendar.YEAR);
                int mm = calendar.get(Calendar.MONTH);
                int dd = calendar.get(Calendar.DAY_OF_MONTH);
                return new DatePickerDialog(getActivity(), this, yy, mm, dd);
            }

标签: androidillegalstateexception

解决方案


改变这个:

@SuppressLint("ValidFragment")
public class SelectDateFragment ...

对此:

public static class SelectDateFragment ...

这里发生的情况是,Android 框架正试图从保存的实例状态中“重新创建”您的 Fragment,并且只有在许多事情为真的情况下才能做到这一点。需要实现的许多事情之一是您的 Fragment 不需要任何其他东西来实例化,但是所有非静态内部类都“需要”外部类的封闭实例才能被实例化.

如果将static关键字添加到 Fragment 的类定义会导致其他问题,则必须单独解决这些问题。也许您的封闭 Activity 类有一个您要调用的方法;你可以替换例如

someActivityCall();

MyActivity activity = (MyActivity) getActivity();
activity.someActivityCall();

推荐阅读