Illegalstateexception Fragment должен быть общедоступным статическим классом для правильного воссоздания из состояния экземпляра - PullRequest
0 голосов
/ 16 сентября 2018

ниже код, который выдает сообщение об ошибке

" java.lang.illegal исключение состояния: фрагмент должен быть публичным статическим класс для правильного воссоздания из состояния экземпляра"

Приведенная ниже ошибка создания фрагмента кода только после того, как я включил **compile '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);
            }

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Измените это:

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

на это:

public static class SelectDateFragment ...

Здесь происходит то, что платформа Android пытается "воссоздать" ваш фрагмент изсохраненное состояние экземпляра, и он может сделать это только в том случае, если число вещей истинно.Одна из многих вещей, которые должны быть истинными, заключается в том, что вашему Фрагменту «не нужно» ничего другого для создания экземпляра, но все нестатические внутренние классы «нуждаются» во внешнем экземпляре внешнегокласс для создания экземпляра.

Если добавление ключевого слова static в определение класса вашего фрагмента вызывает другие проблемы, вам придется решать их отдельно.Возможно, в вашем классе Activity есть метод, который вы хотите вызвать;например,

someActivityCall();

можно заменить на

MyActivity activity = (MyActivity) getActivity();
activity.someActivityCall();
0 голосов
/ 16 сентября 2018

Предположим, что если вы удалите подавляющую аннотацию, вы будете сталкиваться с этой проблемой каждый раз (не только при изменении build.gradle).В вашем случае, предположим, объявление класса SelectDateFragment размещено внутри другого класса - он называется inner class - и не имеет квалификатора static.Таким образом, существует ограничение для Fragment не быть внутренним нестатическим классом.Чтобы решить проблему, вам нужно объявить свой фрагмент как public static class (если он находится внутри другого объявления класса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...