Ошибка при попытке вызвать DatePickerFragment - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь показать DatePicker на Android Studio. У меня есть следующий код:

public class PeopleFragment extends AppFragment implements DatePickerDialog.OnDateSetListener {

    //...

    @OnClick(R.id.people_data)
    public void onDateClick() {

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

                return new DatePickerDialog(getActivity(), PeopleFragment.this, year, month, day);
            }
        };

        dialogFragment.show(getActivity().getFragmentManager(), "DatesPicker");  //error when this line is called

}

Когда я нажимаю кнопку, чтобы отобразить окно выбора даты, я получаю сообщение об ошибке

java.lang.IllegalStateException: Fragment null must be a public static class to be  properly recreated from instance state.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Попробуйте это в файле XML:

<EditText
   android:id="@+id/Birthday"
   custom:font="@string/font_avenir_book"
   android:clickable="true"
   android:editable="false"
   android:hint="@string/birthday"/>

Теперь в файле Java:

Calendar myCalendar = Calendar.getInstance();

EditText edittext= (EditText) findViewById(R.id.Birthday);
DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {
        // TODO Auto-generated method stub
        myCalendar.set(Calendar.YEAR, year);
        myCalendar.set(Calendar.MONTH, monthOfYear);
        myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
        updateLabel();
    }

};

edittext.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        new DatePickerDialog(classname.this, date, myCalendar
                .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                myCalendar.get(Calendar.DAY_OF_MONTH)).show();
    }
});

Теперь добавьте метод в вышеприведенном упражнении.

private void updateLabel() {
    String myFormat = "MM/dd/yy"; //In which you need put here
    SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);

    edittext.setText(sdf.format(myCalendar.getTime()));
}

Добавьте android: focusable = "false" в XML-файл EditText, чтобы обеспечить одно касание.

0 голосов
/ 05 ноября 2018

В ошибке указано, что DatePickerFragment не является классом public static. То, к чему ваш код примерно компилируется, выглядит следующим образом. Обратите внимание, что я оставил все нерелевантные коды:

public class PeopleFragment {

    private class InnerDatePickerFragment extends DatePickerFragment {

        private PeopleFragment parent;

        InnerDatePickerFragment(PeopleFragment parent) {
            this.parent = parent;
        }
    }

    public void onDateClick() {
        DialogFragment dialogFragment = new InnerDatePickerFragment(this);
    }

}

Итак, есть 2 проблемы с вашим кодом:

  • Фрагмент является частным. В вашем случае класс фрагмента фактически объявлен только внутри метода, но использование private в моем примере кода достаточно близко. Вероятно, это также является причиной того, что для имени фрагмента написано null, поскольку класс Fragment на самом деле является анонимным внутренним классом.
  • Фрагмент имеет ссылку на внешнее PeopleFragment.

Ограничение на использование только классов public static является ограничением Android. Из-за жизненного цикла Activity и Fragment Android должен иметь возможность полностью воссоздавать экземпляры Activites и Fragment. В вашем случае он не сможет этого сделать. У него нет возможности создать частный / анонимный фрагмент, и он не сможет установить неявное поле parent.

Как вы можете решить это? Совершенно легко, либо переместите класс DatePickerFragment из класса PeolpeFragment, либо сделайте его внутренним классом public static. Э.Г.

public class PeopleFragment {

    public static class InnerDatePickerFragment extends DatePickerFragment {
        // ... your code goes here ...
    }

    public void onDateClick() {
        DialogFragment dialogFragment = new InnerDatePickerFragment();

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