2012-02-03 13 views
1

私のソフトウェアには、イメージの変更が多く含まれています。リソース番号を繰り返し調べるのではなく、各イメージ参照を表す定数を作成したいと思います。ここに私の試みは、これまでのところ、次のとおりです。このintを定数として初期化するにはどうすればよいですか?

この試みは、スタートアップに近い力を発生させます。

private final int EMPTY = getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud"); 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     ..... 
    } 

この試みは、「最後の変数が初期化されないことがあり、」エラーを返します。ファイナルを削除すると動作します。

private final int EMPTY 

     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
      EMPTY = getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud"); 
     } 

最初の場所で、ここで良いアイデアを定数を使用していますか?

+3

私は定数の全体のポイントはあなたが値を変更できないと思ったのですか? – Xaisoft

+0

私は値を変更したくありません。画像は、アプリケーションの使用を通じて同じIDを保持します。 – Deco

+2

'final'フィールドは、オブジェクトの作成時に設定する必要があります。そのため、コンストラクタでそれらを設定する必要があります。あなたのオブジェクトはまだ準備ができていないので、宣言でそれを行うことはできません。また、そこにあるメソッドは例外をスローすることができます。 – Marcelo

答えて

2

は、最初の場所で、ここで良いアイデアを定数を使用していますか?

いいえそれは資源から値を読み込むルーチン方が良いでしょう:

public class ImageUtils { 

    private static int empty = -1; 

    public static int getEmpty(Context context) { 
     if(empty == -1) 
      empty = context.getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud"); 

     return empty; 
    } 

} 
+0

これは、毎回ファイルから読み込むのではなく、メソッドが値をキャッシュしていることを確認するだけです。 – Marcelo

+0

@Marceloあなたは正しいよ – onof

+0

これは単にintから 'final'を削除するだけの利点はありますか? – Deco

1

定数にリソースをロードすることは不可能です。

私はすでに対象に検索を行い、その上にここquestionを求めていなかった - まさかを。

それを見てください - 彼らはすでに定数です。それで、有効性が問題ではないなら、あなたはそれらをiサイトにすることができます。または、変数にロードします。それは悲しいですね。

+0

これを通常の/変数intとして実装するのはよいでしょうか? – Deco

+0

はい、それは私がそれを自分で使う方法です。しかし、私は複雑な構造にこれを使用し、Oracleでこれらのコードを見ています。私は、より簡単なケースでは "final"を使用できると期待していました。今あなたは殺されている、そうではない、あなたはその希望を殺した:..( – Gangnus

0

アプリケーションクラスを作成します。例here. を参照してください。そして、このようにそれを使用します。

private final int EMPTY = App.getContext().getResources().getIdentifier("dotted_circle", "resId", "en.deco.android.livehud"); 
1

あなたはそれが構築される前に、あなたのクラスのメソッドを呼び出すようにしようとしているので、最初のものは動作しません。建設中の最終変数を初期化していないため、2番目の関数は機能しません。 (定義やコンストラクターで行う必要があります)。 getResource操作を別のクラス(ResourceUtilities.getResources()など)の静的メソッドにして、それを動作させる必要があります。

関連する問題