非法状态异常片段必须是公共静态类才能从实例状态正确重新创建



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

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

更改以下内容:

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

这一点:

public static class SelectDateFragment ...

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

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

someActivityCall();

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

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

最新更新