rootpanthera
rootpanthera

Reputation: 2771

TimePicker in Preferences Activity and OnTimeChangedListener (Not working)

I want to have time picker in preferences activity. It looks like this:

enter image description here

Then if user clicks on "time", it pops up this dialog:

enter image description here

This is EXACTLY what i wanted. But there are few things to notice:

  1. Dialog is my custom dialog referenced by XML

      <TimePicker
        android:id="@+id/timePicker1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    

  2. My preferences XML

    <CheckBoxPreference android:title="Checkbox" android:summary="Checkbox"/>
    <EditTextPreference android:summary="time" android:dialogTitle="Hello" android:dialogLayout="@layout/preflayout" />
    

  3. My Java code:

    public static class TestSettings extends PreferenceActivity implements TimePicker.OnTimeChangedListener {

        TimePicker tp;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref);
            tp = (TimePicker) findViewById(R.id.timePicker1);
    
        }
    
        @Override
        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    
            if(view.getId() == R.id.timePicker1) {
            Log.i("STATIC", "hour "+hourOfDay+"minute "+minute);
            }
        }
    
    }
    

For some reason OnTimeChangedListener does not fire, when i set time. I dont know if this is the right approach to program time picker this way in preferences screen, but i need it exactly like that. Anyway, i don't know why OnTimeChangedListener is not working. Any ideas?

Maybe i need to use another approach to program time picker in preference activity?

Suggestions appriciated. Thanks!

Upvotes: 2

Views: 4395

Answers (2)

zainoz.zaini
zainoz.zaini

Reputation: 938

I have to use custom dialog preference to handle TimePicker on my preference activity.

TimePickerDialog.java

public class TimePickerDialog extends DialogPreference{
    Context context;
TimePickerDialog timePickerDialog;
TimePicker timePicker;
private final static String TAG = "TIME_DIALOG_PREFERENCE";
private Listener timeListener;
String key;


   public TimePickerDialog (Context context) {
        this(context, null);
        this.context=context;
    }

    public TimePickerDialog (Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        this.context=context;
    }

    public TimePickerDialog (Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);

            timeListener=(Listener) context;
            this.context=context;

        setPositiveButtonText("Set");
        setNegativeButtonText("Cancel");

     }

     public void setListener(Listener listener){
        timeListener =listener;
     }

     @Override
     public View onCreateDialogView(){      
        timePicker =  new TimePicker(context);
        timePicker.setIs24HourView(true);
        return timePicker;
     }

     public void onDialogClosed(boolean positiveResult){
        if(timeListener!=null && positiveResult){
            timeListener.setTime( key,timePicker.getCurrentHour(),timePicker.getCurrentMinute());   
        }
    }


     public interface Listener{
        public void setTime(String key,int hour,int minute);
      }

}

The dialog is called from xml file preference layout:

<PreferenceCategory android:title="Schedule" >
    <com.tuxuri.timepicker.TimePickerDialog
        android:defaultValue="08:00"
        android:key="schedule_start_time"
        android:showDefault="true"
        android:summary="When to start"
        android:title="Start time" /> 

</PreferenceCategory>

Then anything invoked by TimePickerDialog will be implemented in PreferenceActivity :

 public class UserPreference extends PreferenceActivity implements TimePickerDialog.Listener {

     @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        timePicker = new TimePickerDialog(this);
        addPreferencesFromResource(R.layout.preference);
     }

     @Override
      public void setTime(String key, int hour, int minute) {
            Log.v(TAG,key+"-"+hour+":"+minute);
       }
}

Upvotes: 1

Rob I
Rob I

Reputation: 5737

You need to call setOnTimeChangedListener(this), probably in your onCreate() method, like this:

tp.setOnTimeChangedListener(this);

Upvotes: 1

Related Questions