-1

実行時にR.javaクラスで生成されたいくつかの文字列リソースにアクセスしようとしています。

R.java:

  public static final class string {
   public static final int app_name=0x7f040000;
    public static final int eightOvereight=0x7f040030;
    public static final int eightOvernine=0x7f040031;
    public static final int fiveOvereight=0x7f040027;
    public static final int fiveOverfive=0x7f040024;
    public static final int fiveOvernine=0x7f040028;
    public static final int fiveOverseven=0x7f040026;
    public static final int fiveOversix=0x7f040025;
    public static final int fourOvereight=0x7f040022;
    public static final int fourOverfive=0x7f04001f;
    {

実行時に私は持っています:

     String current = getStringId(); // assume current = "eightOvereight" after this line

     //now I would like to use R.string.eightOvereight. I don't want to use a switch statement.

リフレクションでこれを達成できますか?

4

3 に答える 3

3

リフレクションを使用できますが、リフレクションは使用しないでください。非常にまれなケースでのみ使用する必要があります。そして、これはそれらの1つではありません。

Android は、実行時に変数リソースを選択するメカニズムを提供します。

String current = getStringId();

Resources res = context.getResources(); // Must provide an Activity or Context object here
int resourceId = res.getIdentifier(current, "string", context.getPackageName());
// Do whatever with resourceId

のドキュメントgetIdentifier()を参照してください。

于 2013-01-04T23:34:09.320 に答える
2

アプリが実際にリフレクションを必要としない場合は、リフレクションを使用することは実際には良い考えではありません。適切な名前でさまざまなフォルダーにリソースを定義することにより、条件(画面サイズ、APIバージョン、ロケールなど)に応じてリソースファイルを使用することにより、実行時にさまざまなリソースを取得できます。

可能であれば、反射を避けるようにしてください。また、String変数に割り当てgetStringId()られるはずの値を割り当てます。int

String current = getStringId();
于 2013-01-04T23:26:19.193 に答える
0

はい、可能です。しかし、これにリフレクションを使用するのは面倒で、複雑で、非効率的であり、壊れやすい可能性があります。

HashMap;を使用してルックアップを行うことをお勧めします。たとえば、これらの変数が静的として存在する必要があると仮定して、これを追加します。

  private static Map<String, Integer> MAP = new Map<String, Integer> {{
      put("eightOvereight", eightOvereight);
      put("eightOvernine", eightOvernine);
      ....
  }

次に、 を使用して値を取得しますMAP.get(str)


注 - これは一般的な Java ソリューションです。@Eric の回答は、より優れた Android 固有のソリューションを提供します。

于 2013-01-04T23:33:50.370 に答える