下面是引发错误消息的代码
“ java.lang.illegal状态异常:片段必须是公共静态的 要从实例状态正确重新创建的类</ strong>“
仅当我在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);
}
答案 0 :(得分:0)
假设如果删除抑制注释,您每次都会遇到该问题(不仅在build.gradle更改时)。在您的情况下,假设SelectDateFragment类的声明放置在另一个类(名为 inner 类)内,并且没有static
限定符。因此,限制Fragment
不能成为内部非静态类。要解决问题,您需要将片段声明为public static class
(如果它放在另一个类声明中)。
答案 1 :(得分:0)
更改此:
@SuppressLint("ValidFragment") public class SelectDateFragment ...
对此:
public static class SelectDateFragment ...
这里发生的是,Android框架正在尝试从已保存的实例状态“重新创建”您的Fragment,并且只有在很多情况下,它才能做到这一点。需要满足的许多事情之一是您的Fragment不需要“其他任何东西”来实例化,而是所有非静态内部类“需要”一个封闭的实例。外部类以便实例化。
如果将static
关键字添加到Fragment的类定义中导致其他问题,则必须分别解决这些问题。也许您封闭的Activity类具有您要调用的方法;您可以替换例如
someActivityCall();
使用
MyActivity activity = (MyActivity) getActivity();
activity.someActivityCall();