2011-03-01 1 views
3

私は自分のアクティビティにViewオブジェクトを持っています。ビューのバックグラウンドリソースを変更したいと思います。具体的には、私はそれをトグルしたいと思います。ここToggling View背景

if (myView.getBackgroundResource() == R.drawable.first) { 
    myView.setBackgroundResource(R.drawable.second); 
} 
else { 
    myView.setBackgroundResource(R.drawable.first); 
} 

問題なしgetBackgroundResource()メソッドが存在しないということで:

だから私はこのようないくつかのロジックが必要になります。

Viewがバックグラウンドで使用しているリソースを取得するにはどうすればよいですか?

答えて

0

リソースからDrawableを取得した後、どのリソースが使用されているかを覚えているとは思いません。

なぜ、あなたの活動に変数インスタンスを使用するか、またはビューをサブクラス化し、それにインスタンス変数を追加しませんか?

+0

私はビューをサブクラス化するつもりだと思います。ありがとう。 – Andrew

0

状態を維持する制御変数を持つ方が簡単ではないでしょうか?フレキシブルで、任意の数のドロウアブルを許可します。あなたが最後にあなたは背景が最初にかかわらず、設定されている場所mCurrentBgを初期化する必要があります

private static final int FIRST_BG = 0; 
private static final int SECOND_BG = 1; 

private int mCurrentBg; 

... 

if (mCurrentBg == FIRST_BG) { 
    myView.setBackgroundResource(R.drawable.second); 
    mCurrentBg = SECOND_BG; 
} 
else { 
    myView.setBackgroundResource(R.drawable.first); 
    mCurrentBg = FIRST_BG; 
} 

を設定したのを追跡するためにフラグを使用することができ

int[] backgrounds = { 
    R.drawable.first, 
    R.drawable.second, 
    R.drawable.third 
}; 

int currentBg; 

void switch() { 
    currentBg++; 
    currentBg %= backgrounds.length; 

    myView.setBackgroundResource(backgrounds[currentBg]); 
} 
+0

画面上のこれらのオブジェクトの数が動的なので、フラグを使用することは問題になります。私は既に他のデータを保持するためにViewのタグを使用しています。 – Andrew

+0

その場合、私は通常の状態とチェックされた状態のために異なったイメージを持つdrawableを作成し、そのように切り替えるでしょう。これがチェックボックスの働きです。 – EboMike

0

+0

画面上のこれらのオブジェクトの数が動的なので、フラグを使用することは問題になります。私は既に他のデータを保持するためにViewのタグを使用しています。 – Andrew

+0

私はマップを使用し、各ビューのタグにキーとして保存しているユニークなデータを使用できると思います。 – Andrew

+0

マップを使用する場合は、ボタンをサブクラス化するだけでビューは同じタイプです)、そこにフラグを埋め込みます。しかし、私の答えのコメントを参照してください - クリーンな方法は、マルチ状態のdrawableを適切に使用することかもしれません。 – EboMike

0

getResources().getIdentifier("filename", "drawable", "com.example.android.project");機能を使用してリソースのIDを取得できます。あなたが見ることができるように、ファイル名、リソースの種類(drawable、レイアウト、または何でも)とそれが入っているパッケージが必要です。

0

EDIT:私の論理が更新されません。

は、私はあなたがここで使用するsetTag()getTag()方法を置くことができるかもしれないと思う:

//set the background and tag initially 
View v = (View)findViewById(R.id.view); 
v.setBackgroundResource(R.drawable.first); 
v.setTag(R.drawable.first); 


if(v.getTag().equals(R.drawable.first)) { 
    v.setBackgroundResource(R.drawable.second); 
    v.setTag(R.drawable.second); 
} else { 
    v.setBackgroundResource(R.drawable.first); 
    v.setTag(R.drawable.first); 
} 

私はこれをテストしていませんが、私は理論的には、それが動作するはずだと思います。欠点は、最初に手動でタグ付けする必要があるため、わずかなオーバーヘッドを追加することですが、最初のタグ付けの後で、フラグの追跡を心配する必要はありません。

+0

私はすでにタグを使って他のデータを保存しています。私はこのビューをサブクラス化し、いくつかの変数を追加するつもりだと思う。 – Andrew

+0

ああ、もしあなたがすでにそれを使用しているなら、それをサブクラス化する方が良いでしょう。がんばろう! – kcoppock