2017-10-15 11 views
0

strings.xmlの配列を使用して静的文字列配列を宣言したいとします。strings.xmlから静的String配列を定義する方法はありますか?

private static final String[] tip_types = getResources().getStringArray(R.array.tip_types_array); 

ただし、getResources()は静的コンテキストでは使用できません。これを行う方法はありますか、または静的変数を使用しないでください。

明らか

private final String[] tip_types = getResources().getStringArray(R.array.tip_types_array); 

作品が、その後、宣言された配列は静的ではありません。

+0

は、なぜあなたが本当に必要な配列 – Killer

+0

を選ぶために静的な文字列が[]より良いスティング[]を返す静的メソッドを作成して、コンテキストまたはリソースオブジェクトを渡す必要がありますかあなたはそれが 'static'ことができますが、それはすることはできません'final'であり、' Context'を持っているときに、ある時点でそれを初期化できる必要があります。 – CommonsWare

+0

私はばかだった!私は、コードの先頭からstrings.xmlに難しい引用宣言を移動しようとしていました。 '= 'の後のすべてが明示的な宣言だったので、私はそれをコードに置き換えようとしていました。それは間違ったアプローチでした。私は今、 'getResources ...'を配列を実際に使用するコードに移動しました。 –

答えて

0

リソース(文字列を含む)をフェッチするには、常にコンテキストが必要です。アクティビティ内でも静的フィールドを作成すると、インスタンスフィールドにアクセスすることができず、したがって利用可能なコンテキストがありません。

あなたは問題を解決するには、2つのオプションがあります:あなたは作成時に静的フィールドにアプリケーションコンテキストを格納するアプリケーションクラスを作成し、アプリケーションコンテキストを使用して、文字列配列を取得することができます

方法1
を。

private final static String[] tip_types = YourApplicationClass.getAppContext().getResources().getStringArray(R.array.tip_types_array); 

方法2
あなたは、コンテキストを渡すあなたの静的変数のgetterを作成することができます。シングルトンの場合と同様に、配列がすでに解決されているかどうかをチェックし、直ちにそれを返すか、または取得したコンテキストを使用して取得します。これは怠惰な初期化の利点があり、配列は実際に必要なときにのみ作成されます。

private static String[] tip_types; 

private static String[] getTipTypes(Context context) { 
    if(tip_types == null) { 
     tip_types = context.getResources().getStringArray(R.array.tip_types_array); 
    } 
    return tip_types; 
} 
+0

私は、私の問題は私が最初に間違ったことをしようとしていたにもかかわらず、私が何をしようとしていなかったのかをうまく説明しているので、この答えを受け入れました! (私の元の質問への私のコメントを参照してください) –

関連する問題