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

Android Illegalstateexception片段必须是公共静态类,才能从实例状态正确地重新创建,android,illegalstateexception,Android,Illegalstateexception,下面是抛出错误消息的代码 “java.lang.Invalize状态异常:片段必须是公共静态的 要从实例状态正确重新创建的类“ 只有在我将**编译'com.google.android.gms:play services ads:11.8.0'**包含在build.gradle文件中后,下面的代码段才会抛出错误,否则工作正常 public void selectDate(View view) { DialogFragment newFragment = new Selec

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

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

只有在我将
**编译'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);
            }

假设如果删除了抑制注释,则每次都会遇到该问题(不仅仅是在build.gradle发生更改时)。在您的例子中,假设SelectDateFragment类的声明被放置在另一个类中——它被命名为innerclass——并且没有
static
限定符。因此,
Fragment
不能是内部非静态类。要解决此问题,您需要将片段声明为
公共静态类(如果它位于另一个类声明中)。

更改此项:

为此:

public static class SelectDateFragment ...
这里发生的事情是,Android框架正试图从保存的实例状态“重新创建”您的片段,并且只有在许多事情都是正确的情况下,它才能这样做。需要证明的一点是,片段不“需要”任何其他东西才能被实例化,但是所有非静态内部类“需要”外部类的封闭实例才能被实例化

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


谢谢,我也遵循了同样的方法,它工作得很好。由于在执行过程中始终保持静态,可能会影响性能,我想检查一下是否有任何方法可以克服此问题。@AndroDeveloper,您所说的影响性能是什么意思?正如我所知,
静态
类对性能的影响不超过
内部
类(没有
静态
限定符)。在另一个类中,没有办法将
片段
标记为非静态,因为在这种情况下,如果没有外部类的实例,android无法重新创建它的实例(需要时)。感谢支持,它在将内容更改为静态后工作正常。由于静态在执行过程中始终存在,可能会影响性能,因此我想检查是否有任何方法可以克服这一问题。@androdeveloper静态内部类不会对性能产生任何影响。您可能会想到公共静态常量,它会在应用程序的生命周期中一直存在,但静态类的实例不会这样做。感谢您添加如何使用
getActivity
解析非静态方法访问!
public static class SelectDateFragment ...
someActivityCall();
MyActivity activity = (MyActivity) getActivity();
activity.someActivityCall();