Illegalstateexception Fragment必须是公共静态类才能从实例状态中正确地重新创建

问题描述 投票:0回答:2

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

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

以下代码片段仅在我在build.gradle文件中包含**compile 'com.google.android.gms:play-services-ads:11.8.0' **后抛出错误,否则正常工作。

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);
            }
android illegalstateexception
2个回答
0
投票

假设如果删除抑制注释,则每次都会遇到该问题(不仅在build.gradle发生更改时)。在你的情况下,假设,SelectDateFragment类的声明被放在另一个类中 - 它被命名为内部类 - 并且没有static限定符。所以Fragment有限制不是内在的非静态类。要解决问题,您需要将片段声明为public static class(如果它放在另一个类声明中)。


0
投票

改变这个:

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

对此:

public static class SelectDateFragment ...

这里发生的事情是Android框架试图从已保存的实例状态“重新创建”您的Fragment,并且只有在许多事情都成立时才能执行此操作。需要实现的许多事情之一是你的Fragment不需要任何其他东西才能被实例化,但是所有非静态内部类“需要”外部类的封闭实例才能被实例化。

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

someActivityCall();

MyActivity activity = (MyActivity) getActivity();
activity.someActivityCall();
© www.soinside.com 2019 - 2024. All rights reserved.