20

私のアプリでは、スピナーが列挙型から入力されています。

ArrayAdapter<myEnum> enumAdapter = new ArrayAdapter<Stroke> (parentActivity.getApplicationContext(), R.layout.simple_spinner_item, myEnum.values());
enumAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
enumSpinner.setAdapter(strokeAdapter);

これは、列挙型のtoString()メソッドのオーバーライドを使用して、 に表示する列挙値のフレンドリ名を取得しますSpinnerstrings.xml現在、私の列挙型にはフレンドリ名用にハードコードされた文字列がありますが、ローカライズをサポートするためにこれらを移動したいと考えています。

ただし、toString は a にアクセスできないContextため、リソース ID を解決する方法がわかりません。

列挙型の toString() メソッドでローカライズされた文字列を取得する方法はありますか?

4

4 に答える 4

34

私がこれを正しく理解していれば、ここでの本当の質問は、必要な文字列のローカライズされたバージョンを取得するために を呼び出すことができるように、Contextからを取得する方法です。enumContext.getString()

1 つのアプローチは、この回答Contextで説明されているアプリケーションのonCreate()メソッドでタイプの静的メンバー変数を設定することです。ここでの考え方は、アプリケーションが作成または再作成されるたびに、簡単にアクセスできる変数でアプリケーション コンテキストを保持するということです。

次に、列挙値のコンストラクターでリソース ID を渡し、toString()メソッドで Context を使用します。

例えば:

public enum Example {
    HELLO(R.string.hello),
    WORLD(R.string.world);

    private int mResourceId;

    private Example(int id) {
        mResourceId = id;
    }

    @Override
    public String toString() {
        return App.getContext().getString(mResourceId);
    }
}
于 2012-09-27T18:05:07.667 に答える
6

@Override public String toString() { return App.getContext().getString(id); }

別のアプリケーションで使用したい場合は、静的コンテキストを参照することができないため、enum クラスがアクティビティに関連付けられていないことが重要です。

したがって、より良い方法は、文字列のリソース ID をアクティビティに戻し、その ID を使用してアクティビティに文字列を取得させることです。

したがって、列挙型クラスから、次のようなメソッドが得られます。

    public  int getResourceId()
  {
    return resourceId;
  }

次に、アクティビティで、配列リストを含むリストを作成します。

final List<String> enumList = new ArrayList<String>();
for ( final MyEnum status : MyEnum.values() )
{
  enumList.add( getString( status.getResourceId() ) );
}

次に、ArrayAdapter、Bingo で enumList を使用できます:)

これで、列挙型クラスとの関係がなくなったので、同じ列挙型クラスを使用する必要がある別のアプリを構築する場合は、簡単に行うことができます。

于 2013-11-25T16:34:06.307 に答える
4

静的アプリケーションの使用は、Instant Run を壊すだけでなく、デカップリングの原則に反するため、モジュール化の実装が困難になるため、常に悪い習慣です。言うまでもなく、Android は実際には 1 つのプロセスで複数のアプリケーションをサポートしています。

このため、列挙型の内部クラスをアダプタ エントリとして定義することをお勧めします。

enum Example {
    A(R.string.label_a),
    B(R.string.label_b);

    Example(@StringRes int label) { mLabel = label; }
    private @StringRes int mLabel;

    class Entry {
        private final Context mContext;
        Entry(final Context context) { mContext = context; }
        @Override public String toString() { return mContext.getString(mLabel); }
    }
}

次に、アダプターの Example.Entry の配列を作成します。

Arrays.stream(Example.values()).map(item -> item.new Entry(context)).toArray(Example.Entry[]::new)
于 2016-11-28T08:22:58.713 に答える
1

私はあなたが何を求めているのかを100%理解しているとは言えません。

列挙型の toString() メソッドでローカライズされた文字列を取得する方法はありますか?

内部のメソッドを使用して、@Override表示方法を変更できます。toString()myEnum

public enum myEnum {
    ONE("1"),
    TWO("2");
    private String pretty;
    private myEnum(String pretty) {
        this.pretty = pretty;
    }
    @Override
    public String toString() {
        // you can localise this string somehow here
        return pretty;
    }
}
于 2012-09-27T17:54:05.390 に答える