Preferences Activity中的TimePicker和OnTimeChangedListener(不工作)

时间:2013-03-29 15:34:38

标签: java android timepicker

我希望在偏好活动中有时间选择器。它看起来像这样:

enter image description here

然后,如果用户点击“时间”,它会弹出此对话框:

enter image description here

这完全是我想要的。但是有几点需要注意:

  1. Dialog是XML引用的自定义对话框

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

  2. 我的偏好设置XML

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

  3. 我的Java代码:

    公共静态类TestSettings扩展PreferenceActivity实现了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);
            }
        }
    
    }
    
  4. 出于某种原因,当我设置时间时,OnTimeChangedListener不会触发。我不知道这是否是在偏好设置屏幕中以这种方式编程时间选择器的正确方法,但我需要它就像那样。无论如何,我不知道为什么OnTimeChangedListener不起作用。有什么想法吗?

    也许我需要使用另一种方法在偏好活动中编程时间选择器?

    建议appriciated。谢谢!

2 个答案:

答案 0 :(得分:1)

您需要使用onCreate()方法拨打setOnTimeChangedListener(this),如下所示:

tp.setOnTimeChangedListener(this);

答案 1 :(得分:1)

我必须使用自定义对话框首选项来处理我的首选项活动上的TimePicker。

<强> 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);
      }

}

从xml文件首选项布局调用该对话框:

<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>

然后,TimePickerDialog调用的任何内容都将在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);
       }
}