3

通常、次を使用してリソース XML から文字列値をフェッチします。

String mystring = getResources().getString(R.string.mystring);

ここで、ランタイム条件に基づいて文字列の代替バージョンを選択したいと思います。

String selectivestring;
if (someBooleanCondition)
  selectivestring= getResources().getString(R.string.mystring);
else 
  selectivestring= getResources().getString(R.string.theirstring);

ここまでは順調ですが、そのような「代替文字列のペア」がたくさんあるので、1 つのタイプ (「my_」など) と代替タイプ (「alt_」など) の前に整然とプレフィックスを付けたいと思います。

String selectivestring1;
if (someBooleanCondition)
  selectivestring1= getResources().getString(R.string.my_string1);
else 
  selectivestring1= getResources().getString(R.string.alt_string1);
.
.
.
String selectivestring2;
if (someBooleanCondition)
  selectivestring2= getResources().getString(R.string.my_string2);
else 
  selectivestring2= getResources().getString(R.string.alt_string2);

(上記のコードは説明用です。最終的にやりたいことは、これをパラメーター化して、これをループ、配列、または独自のアクセサーに入れることができるようにすることです)

Java にプリプロセッサがあれば、文字列連結を使用して "my_" 対 "alt_" プレフィックスを選択できたはずです。しかし、私はそうではないことを知っているので、上記で概説したように、実行時に文字列リソース識別子を変更する方法、回避策、または提案はありますか?

注:各文字列の代替バージョンは、異なる言語/ロケールではありません。私は基本的に、文字列の元のバージョンと別のバージョンを同じリソース ファイルに並べて保持し、2 つを簡単に比較できるようにしています。

4

1 に答える 1

1

まず、コードは次のように少し良くなる可能性があります。

int resource = 
   someBooleanCondition ? 
       R.string.my_string2 : R.string.alt_string2;
String selectivestring2 = getResources().getString(resource);

あなたが説明したように、それはリフレクションで行うことができます。これは非常に簡単な例です:

package br;
import java.lang.reflect.Field;

final class R {
    public static final class string {
        public static final int alt_string1=0x7f060601;
        public static final int alt_string2=0x7f060101;
    }
}
public class StaticReflection {

    public static boolean globalVariable = false;

    //this would be android method getString
    public static String fakeGetString(int id){
        switch (id){
        case R.string.alt_string1: return "it";
        case R.string.alt_string2: return "works";
        default:
            return "O NOES";
        }
    }

    //static method
    public static String getResource(String resId) throws Exception {
        if (globalVariable){
            resId += "string1";
        } else {
            resId += "string2";
        }
        Field f = R.string.class.getDeclaredField(resId);
        Integer id = (Integer) f.get(null);
        return fakeGetString(id);
    }

    public static void main(String[] args) throws Exception {
        globalVariable=true;
        System.out.println(getResource("alt_"));
        globalVariable=false;
        System.out.println(getResource("alt_"));
    }
}
于 2013-06-11T01:50:17.010 に答える