在另一个片段中实现TimePickerDialog.OnTimeSetListener接口的onTimeSet方法时,Android ClassCastException

问题描述 投票:0回答:1

我正在尝试在一个片段中实现TimePickerDialog.OnTimeSetListener,但在执行过程中却遇到了ClassCastException

这是TimePickerFragment类的代码:

public class TimePickerFragment extends DialogFragment {

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        final Calendar calendar = Calendar.getInstance();
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);

        return new TimePickerDialog(
                getActivity(),
                (TimePickerDialog.OnTimeSetListener) getActivity(),
//                this,
                hour,
                minute,
                DateFormat.is24HourFormat(getActivity())
        );
    }
}

我需要在另一个名为SetAlarmFragment的片段中使用用户选择的小时和分钟值。因此,我已经在该片段中实现了TimePickerDialog.OnTimeSetListener。这是代码:

public class SetAlarmFragment extends Fragment implements TimePickerDialog.OnTimeSetListener {

    private TextView timeText;
    private Button timePickerButton;
    private Button confirmationButton;

    private int selectedHour;
    private int selectedMinute;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_set_alarm, container, false);

        initializeUiComponents(view);
        setClickEvents();

        final Calendar calendar = Calendar.getInstance();
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);

        updateTimeText(hour, minute);

        return view;
    }

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        updateTimeText(hourOfDay, minute);
    }

    private void setClickEvents() {
        // to edit time
        timePickerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment timePickerFragment = new TimePickerFragment();
                timePickerFragment.show(getFragmentManager(), "timePicker");
            }
        });

        // on confirmation button pressed
        confirmationButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Calendar cal = Calendar.getInstance();
                AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
                Intent intent = new Intent(getActivity(), AlarmReceiver.class);
                PendingIntent alarmIntent = PendingIntent.getBroadcast(getActivity(), 0, intent, 0);
                if (Build.VERSION.SDK_INT >= 19) {
                    alarmManager.setExact(
                            AlarmManager.RTC_WAKEUP,
                            cal.getTimeInMillis(),
                            alarmIntent
                    );
                } else {
                    alarmManager.set(
                            AlarmManager.RTC_WAKEUP,
                            cal.getTimeInMillis(),
                            alarmIntent
                    );
                }
            }
        });
    }

    private void initializeUiComponents(View view) {
        timeText = view.findViewById(R.id.time_text);
        timePickerButton = view.findViewById(R.id.set_time_button);
        confirmationButton = view.findViewById(R.id.confirm_button);
    }


    private void updateTimeText(int hour, int minute) {
        selectedHour = hour;
        selectedMinute = minute;
        timeText.setText(
                String.format("%d:%d", selectedHour, selectedMinute)
        );
    }
}

现在,我猜测这个问题背后的原因是我正在片段而不是活动中实现onTimeSet()方法。但是我需要从SetAlarmFragment中的TimePicker中选择小时和分钟的值。使用活动而不是片段可能会解决此问题,但是我想尽可能地避免它。我该如何解决这个问题?

这是错误消息:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.apphousebd.digitalmcq.beta, PID: 4467
    java.lang.ClassCastException: com.apphousebd.digitalmcq.mainUi.MainActivity cannot be cast to android.app.TimePickerDialog$OnTimeSetListener
        at com.apphousebd.digitalmcq.fragments.TimePickerFragment.onCreateDialog(TimePickerFragment.java:26)
        at androidx.fragment.app.DialogFragment.onGetLayoutInflater(DialogFragment.java:380)
        at androidx.fragment.app.Fragment.performGetLayoutInflater(Fragment.java:1412)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6810)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
E/UncaughtException: java.lang.ClassCastException: com.apphousebd.digitalmcq.mainUi.MainActivity cannot be cast to android.app.TimePickerDialog$OnTimeSetListener
        at com.apphousebd.digitalmcq.fragments.TimePickerFragment.onCreateDialog(TimePickerFragment.java:26)
        at androidx.fragment.app.DialogFragment.onGetLayoutInflater(DialogFragment.java:380)
        at androidx.fragment.app.Fragment.performGetLayoutInflater(Fragment.java:1412)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6810)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
android android-fragments classcastexception android-timepicker timepickerdialog
1个回答
1
投票
return new TimePickerDialog(
                getActivity(),
                (TimePickerDialog.OnTimeSetListener) getActivity(),
//                this,
                hour,
                minute,
                DateFormat.is24HourFormat(getActivity())
        );

这里您正在呼叫活动。主要在这里:

((TimePickerDialog.OnTimeSetListener)getActivity()

但是TimePickerDialog.OnTimeSetListener由片段而不是活动实现。这就是为什么错误提示MainActivity无法转换为android.app.TimePickerDialog $ OnTimeSetListener的原因。因为MainActivity没有实现它。但是通过调用getActivity()可以调用MainActivity。更改TimePickerFragment类的返回值。

© www.soinside.com 2019 - 2024. All rights reserved.