Android не показывается DatePickerDialog в DialogFragment

123
13 января 2021, 17:40

Задача: реализовать фрагмент, который позволяет вернуть в место (во фрагмент), откуда этот фрагмент вызван, выбранную пользователем дату.

Почитав похожие темы, что необходимо использовать DatePickerDialog внутри DialogFragment.

На данный момент пробую просто хотябы показать этот календарь Вот как сейчас это выглядит:

public class DatePickerDialogFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    public static DatePickerDialogFragment newInstance() {
        return new DatePickerDialogFragment();
    }
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        final Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog datePickerDialog = new DatePickerDialog(getContext(), this, year, month, day);
        datePickerDialog.show();
        return datePickerDialog;
    }
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month, dayOfMonth);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = sdf.format(calendar.getTime());
    }
}

Пробую вызвать из NavigationDrawerActivity (), но появляется просто пустой Fragment, а окно в нем не появляется.

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    Fragment fragment = null;
    switch (item.getItemId()){
        case R.id.nav_setting_student:
            fragment = SearchScheduleStudentFragment.newInstance();
            break;
        case R.id.nav_gallery:
            fragment = DatePickerDialogFragment.newInstance();
            break;
    }
    if(fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.container, fragment)
                .commit();
        item.setChecked(true);
        setTitle(item.getTitle());

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
    return false;
}

Пока предварительно думаю, что Fragment пустой из-за того что мы не указали в onCreateView layout, но ведь для DatePickerDialog этого и не требуется.

Возможно ошибаюсь, помогите разобраться

Answer 1

Попробуйте так

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
private static DatePickerDialog.OnDateSetListener listener;
public static DatePickerFragment getInstance(DatePickerDialog.OnDateSetListener listener){
    DatePickerFragment.listener = listener;
    return new DatePickerFragment();
}
public DatePickerFragment(){}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the current date as the default date in the picker
    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);
    // Create a new instance of DatePickerDialog and return it
    return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
    listener.onDateSet(view, year, month, day);
}}

Для Вызова этого диалога используйте код:

DialogFragment newFragment = DatePickerFragment.getInstance(this);
newFragment.show(getFragmentManager(), "datePicker");