19

getString()アクティビティが作成される前に、リソースから文字列を取得して文字列配列に割り当てるために使用しようとしています。

private static final String[] MenuNames = {
    Resources.getSystem().getString(R.string.LCMeterMenu),
    Resources.getSystem().getString(R.string.FrecMenu),
    Resources.getSystem().getString(R.string.LogicAnalyzerMenu),
    "Prueba con achartengine",
    Resources.getSystem().getString(R.string.BrazoMenu)
};

を使用するResources.getSystem().getString(R.string.LCMeterMenu)と、Eclipseは文句を言いませんが、実行時にエラーが発生します。

原因:android.content.res.Resources $ NotFoundException:文字列リソースID#0x7f0a000a

しかし、私が中に入れればonCreate()

Log.i("StringR", "String: " + getString(R.string.LCMeterMenu));

文字列を取得しましたが、前に定義した最後の文字列に割り当てることができません。静的なエラーメッセージが表示さgetString()れる前にのみ使用した場合。以前にグローバル変数onCreate()にリソースを使用するにはどうすればよいですか?onCreate()

4

5 に答える 5

28

static finalリソースからフィールドを初期化することはできません。フィールドは、クラスの初期化時に初期化する必要があり、実行時にアプリケーション リソースがバインドされる前に発生します。(ちなみに、その方法で取得しResources.getSystem()Resourcesオブジェクトにはシステム リソースのみが含まれており、アプリケーション リソースは含まれていないため、使用できません。)

アプリケーション リソースがバインドされる前にこれらの文字列を使用できるようにする必要がある場合、実際に行う唯一の方法は、文字列をコードに直接配置することです。ただし、「Android の方法」では、コードを整理して、初期化が実行中 (または実行後) にのみ行われるようにする必要がありますonCreate()。文字列配列を初期化するだけでonCreate()、フィールドを静的または最終にすることを心配する必要はありません。

文字列配列を特定のアクティビティに関連付けたくない場合は、アプリケーション クラスのメソッドApplication内のリソースから配列をサブクラス化して読み取ることができます。onCreate()(マニフェストでカスタム アプリケーション クラスを宣言する必要もあります。)ただし、ドキュメントでは、このようなアプローチは推奨されていません。(配列はプライベートであるため、とにかく単一のアクティビティに密接に結びついていると思われるため、Applicationサブクラスの使用は保証されていないようです。)

別の方法は、配列のシングルトン クラスを宣言することです。Context必要に応じてリソースを取得できるように、シングルトン アクセサー関数には が必要です。

public class StringArray {
    private static String[] theArray;
    public static String[] getArray(Context context) {
        if (theArray == null) {
            theArray = context.getResources().getStringArray(R.array.my_strings);
        }
        return theArray;
    }
}

(これは、文字列データが<string-array>@JaiSoni の回答で提案されているようなリソースで定義されていることを前提としています。) 繰り返しますが、 member フィールドを宣言することはできませんfinal

于 2012-09-20T06:48:35.413 に答える
4

いいえ、 の前に Resources を使用することはできませんonCreate()。すべての文字列を取得できる場所をonCreate()使用して、リソースのインスタンスを取得できます。getResources()また、文字列は で定義することにより、すでに static として宣言されていますstrings.xml

リソースにアクセスするための疑似コード、

Resources res = getResources();
String app_name = res.getString(R.string.app_name);
于 2012-09-20T04:33:37.580 に答える
3

もう 1 つの方法は、静的配列をリソース識別子 (リソース自体ではなく既に利用可能) で初期化することです。

private static final int[] MenuNames = {
    R.string.LCMeterMenu,
    R.string.FrecMenu,
    ...
};

このようにして、リソースが実際に利用可能になるまでリソースの読み込みを遅らせることができます。

String s = getResources().getString(MenuNames[i]);
于 2015-07-22T15:46:04.737 に答える
0

によって得られるものは、getString(int resId)すでにアプリケーションの定数になります。なぜ別のfinal static変数に保持する必要があるのですか。そんな風にいつでも読めますよね?

于 2012-09-20T04:34:55.140 に答える