ユーザーが特定の時点を指定する必要があるアプリケーションを作成していますが、ユーザーが選択できる分の値を設定する方法がわかりません。1 の増分ではなく 5 の増分のみを使用します。 .
簡単に言えば、ユーザーが利用可能な金額をスクロールすると、0、5、10、15 などしか表示されません。
前もって感謝します。
ユーザーが特定の時点を指定する必要があるアプリケーションを作成していますが、ユーザーが選択できる分の値を設定する方法がわかりません。1 の増分ではなく 5 の増分のみを使用します。 .
簡単に言えば、ユーザーが利用可能な金額をスクロールすると、0、5、10、15 などしか表示されません。
前もって感謝します。
API 21+ との互換性を確保するには、TimePicker に次の属性があることを確認してください。
android:timePickerMode="spinner"
次に、プログラムで間隔を設定する方法を示します。分フィールドが見つからない場合、このメソッドは標準の TimePicker にフォールバックします。
private static final int INTERVAL = 5;
private static final DecimalFormat FORMATTER = new DecimalFormat("00");
private TimePicker picker; // set in onCreate
private NumberPicker minutePicker;
public void setMinutePicker() {
int numValues = 60 / INTERVAL;
String[] displayedValues = new String[numValues];
for (int i = 0; i < numValues; i++) {
displayedValues[i] = FORMATTER.format(i * INTERVAL);
}
View minute = picker.findViewById(Resources.getSystem().getIdentifier("minute", "id", "android"));
if ((minute != null) && (minute instanceof NumberPicker)) {
minutePicker = (NumberPicker) minute;
minutePicker.setMinValue(0);
minutePicker.setMaxValue(numValues - 1);
minutePicker.setDisplayedValues(displayedValues);
}
}
public int getMinute() {
if (minutePicker != null) {
return (minutePicker.getValue() * INTERVAL);
} else {
return picker.getCurrentMinute();
}
}
これはプログラムで行うことができます。
pickStartTime = (TimePicker)findViewById(R.id.StartTime);
pickStartTime.setOnTimeChangedListener(mStartTimeChangedListener);
int nextMinute = 0;
次に、以下のOnTimeChangedListener
ように設定します
private TimePicker.OnTimeChangedListener mStartTimeChangedListener =
new TimePicker.OnTimeChangedListener() {
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
updateDisplay(view, startDate, hourOfDay, minute);
}
};
private TimePicker.OnTimeChangedListener mNullTimeChangedListener =
new TimePicker.OnTimeChangedListener() {
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {}
};
と、
private void updateDisplay(TimePicker timePicker, Date date, int hourOfDay, int minute)
{
nextMinute = nextMinute+5;
// remove ontimechangedlistener to prevent stackoverflow/infinite loop
timePicker.setOnTimeChangedListener(mNullTimeChangedListener);
// set minute
timePicker.setCurrentMinute(nextMinute);
// look up ontimechangedlistener again
timePicker.setOnTimeChangedListener(mStartTimeChangedListener);
// update the date variable for use elsewhere in code
date.setMinutes(nextMinute);
}
ネットを検索した後、最も簡単な解決策が見つかりませんでした。
だから私は共有することにしました:
あなたは反射を使うことができます!
次のコードでは 10 分の間隔を使用していますが、DISPLAYED_MINS 配列で使用する分を選択できます。
private final static String[] DISPLAYED_MINS = { "0", "10", "20", "30", "40", "50" };
private NumberPicker getMinuteSpinner(TimePicker t)
{
try
{
Field f = t.getClass().getDeclaredField("mMinuteSpinner"); // NoSuchFieldException
f.setAccessible(true);
return (NumberPicker) f.get(t); // IllegalAccessException
}
catch (Exception e)
{
Log.e("timepicker","field name has been changed, check grepcode");
return null;
}
}
タイムピッカーを作成するとき:
final TimePicker dpStartDate = (TimePicker) view.findViewById(R.id.dpStartDate);
NumberPicker startMinSpiner = getMinuteSpinner(dpStartDate);
if (null != startMinSpiner)
{
startMinSpiner.setMinValue(0);
startMinSpiner.setMaxValue(DISPLAYED_MINS.length - 1);
startMinSpiner.setDisplayedValues(DISPLAYED_MINS);
}
getCurrentMinute() が選択された分を DISPLAY_MINS 配列で返すことを忘れないでください。分を取得するには:
int theTime = 0;
for (String number: DISPLAYED_MINS) {
int theNumber = Integer.parseInt(number);
if (theNumber % 5 != 0) {
theNumber = ((int)(theNumber / 5)) * 5;
}
if (theNumber == dpStartDate.getCurrentMinute()) {
theTime = theNumber;
break;
}
}