fragments should be static such that they can be re-instantiated by the system, and anonymous classes are not static

111
20 мая 2019, 02:30

Вот весь код, который задействован

//Класс,в котором всё реализуется
public class AddingTaskDialogFragment extends DialogFragment {
//Статический вложенный класс DatePickerFragment
public static class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {
    public DatePickerFragment(){
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        return new DatePickerDialog(getActivity(), this, year, month, day);
    }
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    }
}
//Метод, в котором реализуется весь функционал
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(R.string.dialog_title);
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View container = inflater.inflate(R.layout.dialog_task, null);
    final TextInputLayout tilTitle = (TextInputLayout) container.findViewById(R.id.tilDialogTaskTitle);
    final EditText etTitle = tilTitle.getEditText();
    TextInputLayout tilDate = (TextInputLayout) container.findViewById(R.id.tilDialogTaskDate);
    final EditText etDate = tilDate.getEditText();
    final TextInputLayout tilTime = (TextInputLayout) container.findViewById(R.id.tilDialogTaskTime);
    final EditText etTime = tilTime.getEditText();

    tilTitle.setHint(getResources().getString(R.string.task_title));
    tilDate.setHint(getResources().getString(R.string.task_date));
    tilTime.setHint(getResources().getString(R.string.task_time));
    builder.setView(container);
    //Реализация
    etDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (etDate.length() == 0) {
                etDate.setText(" ");
            }
            /*Ругается на DatePickerFragment:
            * Fragments should be static such that they can be re-instantiated by the system, and anonymous classes are not static
            */
            DialogFragment datePickerFragment = new DatePickerFragment() {
                @Override
                public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                    Calendar dateCalendar = Calendar.getInstance();
                    dateCalendar.set(year, monthOfYear, dayOfMonth);
                    etDate.setText(Utils.getDate(dateCalendar.getTimeInMillis()));
                }
                @Override
                public void onCancel(DialogInterface dialog) {
                    etDate.setText(null);
                }
            };
            datePickerFragment.show(getFragmentManager(), "DatePickerFragment");
        }
    });

//Часть не задевающая мэйн код, но на всякий случай я её сюда вставил
AlertDialog alertDialog = builder.create();
    alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            final Button positiveButton = ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE);
            if(etTitle.length() == 0) {
                positiveButton.setEnabled(false);
                tilTitle.setError(getResources().getString(R.string.dialog_error_empty_title));
            }
            etTitle.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    if (s.length() == 0) {
                        positiveButton.setEnabled(false);
                        tilTitle.setError(getResources().getString(R.string.dialog_error_empty_title));
                    } else {
                        positiveButton.setEnabled(true);
                        tilTitle.setErrorEnabled(false);
                    }
                }
                @Override
                public void afterTextChanged(Editable s) {
                }
            });
        }
    });
    return alertDialog;
}

}

Вот как я вызываю AddingTaskDialogFragment в коде MainActivity:

public void setUI(){
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DialogFragment addingTaskDialogFragment=new AddingTaskDialogFragment();
            addingTaskDialogFragment.show(fragmentManager, "AddingTaskDialogFragment");
        }
    });
Answer 1

Фрагменты как и активити и сервисы управляются системой. В т.ч. система может их восстановить после уничтожения процесса по к-л причине. Чтобы это работало система должна иметь информацию об этих компонентах. При этом она не может её получить из анонимного класса, о чём и сообщает.

Засим, вам надо заменить ваши анонимные классы на статические внутренние классы или обычные классы в отдельных файлах.

Answer 2

Поискав в инете решения данной проблемы, я узнал, что данный вариант кода устаревший (2015 года) и если как-то его и использовать, то необходимо его почти полностью менять (в особенности DatePickerFragment на DatePickerDialog с таймпикером аналогично). Так что решения проблемы попросту нет, код уже никем не используется.

READ ALSO
Сортировка сообщений в ArrayList

Сортировка сообщений в ArrayList

Есть кастомный адаптер для лист вью в который добавляются сообщенияПоследовательность сообщений идет сверху вниз

176
Java x64 и x86 в чем разница?

Java x64 и x86 в чем разница?

Откомпилировал одно и тоже приложение примерно по 1000 раз на 86 и 64 разрядной windows 7 результат такой:

168
Сортировка массивов int чисел

Сортировка массивов int чисел

Имеется 2 массива с числамиЭлементы в них находятся в некой зависимости, т

132
как сделать маску? [закрыт]

как сделать маску? [закрыт]

Как сделать такую маску, что-бы можно было правый квадрат центрировать как сверху так и снизу (то есть что-бы можно было привязать паралакс)?

160