4

ユーザーが時間を分と秒で入力できるダイアログを実装する必要があります。例: 6 分 30 秒。また、分数の上限も必要です (つまり、分は 0 から 10 の範囲で、秒は 0 から 60 の範囲になります)。

しかし、ここで説明したように、Android の TimePicker は時間と分しか表示しません。秒を追加することについての投稿をいくつか見ましたが、時間を削除して秒を追加することについては何もありません。おそらく、分に制限を課す方法もありません。

NumberPicker を使用してカスタム タイム ピッカーを作成することを推奨する投稿をいくつか見ましたが、NumberPicker は内部目的であり、使用すべきではないという警告も見ました。これはCatch-22のようです。

TimePicker や NumberPicker のソースを変更することもできますが、それらがどのように機能するかを理解し、今後カスタム バージョンを維持するのにどれだけの時間がかかるかはわかりません。

私は、カスタムの分秒ピッカーを実装する必要があると思います。上下ボタンを使用して数字を移動するのはそれほど難しくないように見えますが、ユーザーがスワイプして各「ホイール」の数字をスクロールできるようにする方法がわかりません。

助言がありますか?

4

2 に答える 2

6

この SO 回答を使用して分間隔を 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();
        }

    }

}

コールバックでは、2 番目の引数の値を分として、3 番目の引数の値を秒として扱います。

「分」スピナーが 24 を超える数値に設定されている場合、Android の将来のバージョンでは誤った結果が返される可能性がありますが、現在の TimePicker コードを読んだところ、問題は見られませんでした。また、午前/午後のスピナーを秒のスピナーに変更または置き換えることも可能であり、ピッカーは時:分:秒と分:秒をサポートできます。

于 2014-07-27T02:18:36.033 に答える