0

列挙型から入力されるスピナーがあります:

public enum Frequencies
    {
    EVERYDAY("Every day"), EVERYOTHERDAY("Every second day");

    private String friendlyName;

    private Frequencies(String friendlyName)
    {
        this.friendlyName = friendlyName;
    }

    @Override public String toString()
    {
        return friendlyName;
    }
    };

toString()オーバーライドは、スピナーがユーザーフレンドリーな名前を表示することを意味します。

スピナーは次のように入力されます。

        ArrayAdapter<Frequencies> adapter = new ArrayAdapter<Frequencies>(this, android.R.layout.simple_spinner_item, 
            Frequencies.values());
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    newAlarmFreqSpinner.setAdapter(adapter);

これらはすべてうまく機能しています。ユーザーがスピナーから頻度を選択するとき、その値を使用して、単純なオブジェクトlongのアラーム間の間隔を表す値を設定したいと思います。Alarmしたがって、「Everyday」の値は1日の秒数になります。

ただし、スピナーから取得したFrequencyオブジェクトをエレガントに処理する方法については頭を悩ませることはできません。私の最初の考えは、switchステートメントを使用して表示された文字列をオンにして、必要な長い値を決定することでしたが、もちろん、文字列をオンにすることはできませんswitch

次に、Frequencies列挙型を変更して、各エントリが独自のlong値を格納するようにしました。

    EVERYDAY("Every day", 86400), EVERYOTHERDAY("Every second day", 86400 * 2);

private String friendlyName;
public final int intervalInSecs;

private Frequencies(String friendlyName, int intervalInSecs)
{
    this.friendlyName = friendlyName;
    this.intervalInSecs = intervalInSecs;
}...

しかし、スイッチは「ケース式は定数式でなければならない」と文句を言います(私が作成したとしてもintervalInSecs final):

    Object obj = newAlarmFreqSpinner.getSelectedItem();
    switch(((Frequencies)obj).getIntervalInSecs())
{
    case Frequencies.EVERYDAY.intervalInSecs: //Java doesn't like this
    {

        break;
    }...

私はこれを実際よりも難しくしていると確信しています!何かアイデアをいただければ幸いです。

4

1 に答える 1

1

基本的に、列挙型には関連する間隔があります。したがって、間隔をオンにする必要はなく、列挙型をオンにするだけです。

Object obj = newAlarmFreqSpinner.getSelectedItem();
switch((Frequencies)obj) {
case Frequencies.EVERYDAY {
    alarm.setInterval(EVERYDAY.getIntervalInSecs());
    break;
}...
于 2012-05-24T11:46:39.107 に答える