当前位置: 代码迷 >> Android >> Illegalstateexception Fragment必须是公共静态类,才能从实例状态正确地重新创建
  详细解决方案

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

热度:54   发布时间:2023-08-04 12:29:41.0

以下是引发错误消息的代码

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);
            }

假设如果删除抑制注释,您每次都会遇到该问题(不仅在build.gradle更改时)。 在您的情况下,假设SelectDateFragment类的声明放置在另一个类(称为内部类) ,并且没有static限定符。 因此,存在对Fragment不能成为内部非静态类的限制。 要解决问题,您需要将片段声明为public static class (如果将其放置在另一个类声明中)。

更改此:

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

对此:

public static class SelectDateFragment ...

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

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

 someActivityCall(); 

MyActivity activity = (MyActivity) getActivity();
activity.someActivityCall();
  相关解决方案