Как исправить метод показа в FragmentDialog - PullRequest
0 голосов
/ 14 ноября 2018

Я пишу этот код, чтобы показать время в моем проекте, когда я запускаю приложение перестает работать. Однако при удалении метода show программа работает, когда при нажатии кнопки

ничего не отображается.

любая помощь, пожалуйста

это код

public class AlarmFragment extends Fragment implements 
    TimePickerDialog.OnTimeSetListener{
    private Button clockBtn;
    private TextView time;
 public AlarmFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view= inflater.inflate(R.layout.fragment_alarm, container, false);
    time = view.findViewById(R.id.alarm_time);
    clockBtn= view.findViewById(R.id.clock_btn);
    clockBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            DialogFragment clock= new TimeClock();
              ///////////show method /////////
             clock.show(getActivity().getSupportFragmentManager(),"Time Picker");


        }
    });
    return view;
}
  @Override
     public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        time.setText("Time:" + hourOfDay +" : "+minute);
      }}

это фрагмент TimeClock

import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import java.util.Calendar;

public class TimeClock 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(), (TimePickerDialog.OnTimeSetListener) getActivity(), hour, minute, android.text.format.DateFormat.is24HourFormat(getActivity()));
    }
}

Редактировать: - поэтому я изменил оператор return выше, тогда он работает. Но метод onTimeSet в AlarmFragment не выполнялся Я сделал это следующим образом: -

Activity activity = new AlarmFragment().getActivity();

        return new TimePickerDialog(getActivity(), (TimePickerDialog.OnTimeSetListener)activity, hour, minute, android.text.format.DateFormat.is24HourFormat(getActivity())); 

Ответы [ 2 ]

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

Вы получаете ClassCastException, потому что ваш getActivity - это не TimePickerDialog.OnTimeSetListener, а ваш AlarmFragment:

// this is where it fails, change this line, do not copy
return new TimePickerDialog(getActivity(), (TimePickerDialog.OnTimeSetListener) getActivity(), hour, minute, android.text.format.DateFormat.is24HourFormat(getActivity()));

Вы можете реорганизовать свой класс TimeClock, чтобы делегироватьслушатель:

public class TimeClock extends DialogFragment {

    private TimePickerDialog.OnTimeSetListener listener;

    public void setOnTimeSetListener(TimePickerDialog.OnTimeSetListener listener) {
        this.listener = listener;
    }

    @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);
        // Now delegates the listener to the constructor
        return new TimePickerDialog(getActivity(), listener, hour, minute, android.text.format.DateFormat.is24HourFormat(getActivity()));
    }
}

И установите слушателя до TimeClock.show:

DialogFragment clock= new TimeClock();
clock.setOnTimeSetListener(this);
clock.show(getActivity().getSupportFragmentManager(), "Time Picker");
0 голосов
/ 14 ноября 2018

В Activity, в котором находится AlarmFragment, вы должны реализовать TimePickerDialog.OnTimeSetListener.

Например:

public class MainActivity implements TimePickerDialog.OnTimeSetListener {

    ...

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        Toast.makeText(this, "chosen hour of day: " + hourOfDay, Toast.LENGTH_LONG).show();
    }
}
...