Ayesha Anika
Ayesha Anika

Reputation: 47

Cannot access onTimeSet method in TimePickerDialog

I am trying to get time from timepicker in a FragmentActivity. For this reason I create a class named TimePickerFragment. this is the class:

public class TimePickerFragment extends DialogFragment  {

    public static TimePickerFragment newInstance() {
        return new TimePickerFragment();
    }

    private TimePickerDialog.OnTimeSetListener 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);
        return new TimePickerDialog(getActivity(), listener, hour, minute, DateFormat.is24HourFormat(getActivity()));
    }
    public void setListener(TimePickerDialog.OnTimeSetListener listener) {
        this.listener = listener;
    }

And this is my Fragmnet activity:

public class CreateClass extends DialogFragment implements TimePickerDialog.OnTimeSetListener  {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    final View view  = inflater.inflate(R.layout.activity_create_class, container, false);
    //findingbyid

    TimePickerFragment.newInstance().setListener(this);
    starttime.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DialogFragment timepicker = new TimePickerFragment();
            timepicker.show(getFragmentManager(), "time picker");
            flag = 1;
        }
    });
    endtime.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DialogFragment timepicker = new TimePickerFragment();
            timepicker.show(getFragmentManager(), "time picker");
            flag = 2;
        }
    });
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    int h = hourOfDay;
    int m = minute;
    Displaytime(h, m);
}

public void Displaytime(int h, int m) {
    if(flag == 1){
        if(h>12){
            stimeedit.setText(String.valueOf(h-12)+":"+(String.valueOf(m)+" pm"));
        }else if (h==12){
            stimeedit.setText("12:"+(String.valueOf(m)+" pm"));
        }else if (h<12){
            if(h!=0){
                stimeedit.setText(String.valueOf(h)+":"+(String.valueOf(m)+" am"));
            }
        }
    }
    if(flag == 2){
        if(h>12){
            etimeedit.setText(String.valueOf(h-12)+":"+(String.valueOf(m)+" pm"));
        }else if (h==12){
            etimeedit.setText("12:"+(String.valueOf(m)+" pm"));
        }else if (h<12){
            if(h!=0){
                etimeedit.setText(String.valueOf(h)+":"+(String.valueOf(m)+" am"));
            }
        }
    }
}}

with this code, after pressing the button timepickerFragment is showing and I can choose time but the time doesn't set in edittext. if i set any value in edittext in onclicklister method that perfectly works. I am giving an example:

 starttime.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DialogFragment timepicker = new TimePickerFragment();
        timepicker.show(getFragmentManager(), "time picker");
        stimeedit.settext("hello");
    }
});

in stimeedit, "hello" is set perfectly. please, can anyone tell me, how can I add time in edittext.

Upvotes: 0

Views: 93

Answers (1)

andrei
andrei

Reputation: 2940

You are not setting the listener on the same instance that gets displayed. They are 2 different objects

TimePickerFragment.newInstance().setListener(this);

This is the first instance which has the listener but is not displayed on screen. That is why you are not receiving any callbacks.

starttime.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DialogFragment timepicker = new TimePickerFragment();
        timepicker.show(getFragmentManager(), "time picker");
        flag = 1;
    }
});
endtime.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DialogFragment timepicker = new TimePickerFragment();
        timepicker.show(getFragmentManager(), "time picker");
        flag = 2;
    }
});

And here you have two other instances which you want to listen to.

Upvotes: 1

Related Questions