как показать фрагмент Timepicker внутри другого фрагмента - PullRequest
0 голосов
/ 16 февраля 2020

Я создал собственный фрагмент Timepicker, расширив фрагмент диалога. но когда я вызываю его из домашнего фрагмента, приложение вылетает, говоря: MainActivity cannot be cast to android.app.TimePickerDialog$OnTimeSetListener

вот мой пользовательский timePickerFragment

public class TimePickerFragment extends DialogFragment{
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);
        return new TimePickerDialog(getActivity(), R.style.TimePickerTheme,(TimePickerDialog.OnTimeSetListener) getActivity(),hour,minute,DateFormat.is24HourFormat(getActivity()));
    }
}

вот откуда я вызываю этот фрагмент:

public class HomeFragment extends Fragment implements AlarmRecyclerViewListener,TimePickerDialog.OnTimeSetListener{
.
.
.

@Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_home,container,false);
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        .
        .
        .
        FloatingActionButton btn = getView().findViewById(R.id.fab_button2);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DialogFragment timePicker = new TimePickerFragment();
                timePicker.show(getChildFragmentManager(),"time picker");
            }
        });
        @Override
        public void onTimeSet(TimePicker timePicker, int hour, int minute) {
            Log.d("msgg","I'm here");
            Calendar c = Calendar.getInstance();
            c.set(Calendar.HOUR_OF_DAY, hour);
            c.set(Calendar.MINUTE, minute);
            c.set(Calendar.SECOND, 0);
          mAlarmsDBhelperClass.insertAlarm("","⚡","",hour,minute,"ON",0,db);
        startAlarm(c,0,true,hour+minute+1);
       }

}
}

1 Ответ

2 голосов
/ 16 февраля 2020

Ваша проблема здесь

return new TimePickerDialog(getActivity(), R.style.TimePickerTheme,(TimePickerDialog.OnTimeSetListener) getActivity(),hour,minute,DateFormat.is24HourFormat(getActivity()));

вы уже внедрили TimePickerDialog.OnTimerSetListener в HomeFragment, но в этом коде вы пытались получить слушателя от родительской активности.

Я думаю, вам следует вставьте объект прослушивателя в TimerPickerFragment, как показано ниже:

public class TimePickerFragment extends DialogFragment {
    //Fragments need to empty constructor
    TimePickerFragment(){

    }

    TimePickerFragment(TimePickerDialog.OnTimeSetListener onTimeSetListener){
        this.onTimeSetListener = onTimeSetListener;
    }
    TimePickerDialog.OnTimeSetListener onTimeSetListener;

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);
        return new TimePickerDialog(getActivity(), R.style.TimePickerTheme,onTimeSetListener,hour,minute, DateFormat.is24HourFormat(getActivity()));
    }
}

А в HomeFragment вы можете создать экземпляр TimePickerFragment, как показано ниже:

DialogFragment timePicker = new TimePickerFragment(this);

...