2013-10-22 133 views
4

我需要實現一個對話框,用戶可以在該對話框中以分鐘和秒鐘輸入時間。例如:6分30秒。在那裏我還需要分鐘數的上限(即分鐘範圍從0到10秒,從0到60)。如何實現android分鐘秒選擇器?

但正如這裏所討論的,Android TimePicker只顯示小時和分鐘。我看過幾篇關於添加秒的文章,但沒有關於刪除小時和添加秒的內容。也許沒有辦法對會議紀要施加限制。

我見過幾篇文章,推薦使用NumberPicker創建自定義時間選擇器,但也注意到NumberPicker僅用於內部目的,不應使用。這似乎是一個Catch-22。

我可以嘗試修改TimePicker或NumberPicker的源代碼,但我不知道需要多少時間才能理解它們如何工作並保持定製版本的前進。

我想這讓我實現了一個自定義的分鐘秒選擇器。使用上下按鈕移動數字看起來並不難,但我不知道如何讓用戶輕掃以滾動每個「輪子」中的數字。

有什麼建議嗎?

回答

5

使用this SO answer到分鐘間隔添加到TimePickerDialog後,我提出,延伸小時旋轉器的範圍0-60和對待小時類似亞類:分鐘紡紗作爲分:秒:

import android.app.TimePickerDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.widget.NumberPicker; 
import android.widget.TimePicker; 

import java.lang.reflect.Field; 
import java.util.ArrayList; 
import java.util.List; 

public class DurationPicker extends TimePickerDialog { 

    private TimePicker timePicker; 
    private final OnTimeSetListener callback; 

    private int initialMinutes; 

    public DurationPicker(Context context, OnTimeSetListener callBack, int minutes, int seconds) { 
     super(context, callBack, minutes, seconds, true); // the last argument removes the am/pm spinner 
     this.callback = callBack; 
     this.initialMinutes = minutes; // we'll have to set this again after modifying the "hours" spinner 
     this.setTitle("Set duration"); 
    } 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     if (callback != null && timePicker != null) { 
      timePicker.clearFocus(); 
      callback.onTimeSet(timePicker, timePicker.getCurrentHour(), timePicker.getCurrentMinute()); 
     } 
    } 

    @Override 
    public void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     try { 
      Class<?> classForid = Class.forName("com.android.internal.R$id"); 
      Field timePickerField = classForid.getField("timePicker"); 
      this.timePicker = (TimePicker) findViewById(timePickerField.getInt(null)); 
      Field field = classForid.getField("hour"); 

      // modify the hours spinner to cover the maximum number of minutes we want to support 
      int maxMinutes = 60; 
      NumberPicker mHourSpinner = (NumberPicker)timePicker.findViewById(field.getInt(null)); 
      mHourSpinner.setMinValue(0); 
      mHourSpinner.setMaxValue(maxMinutes); 
      List<String> displayedValues = new ArrayList<String>(); 
      for (int i = 0; i <= maxMinutes; i++) { 
       displayedValues.add(String.format("%d", i)); 
      } 
      mHourSpinner.setDisplayedValues(displayedValues.toArray(new String[0])); 
      mHourSpinner.setValue(initialMinutes); // we can set this again now that we've modified the hours spinner 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 

在回調中,只需將第二個參數的值作爲分鐘,將第三個參數的值作爲秒。

未來版本的Android可能會在「分鐘」微調器設置爲24以上的數字時返回不正確的結果,但我通讀了當前的TimePicker代碼並未發現任何問題。此外,可以使用秒控制器修改或更換am/pm微調器,然後選擇器可以支持小時:分鐘:秒以及分鐘:秒。

+0

對話框中的時間選取器顯示爲時鐘,而不是作爲微調器。模式如何改變? –