2012-03-21 7 views
0

私はAndroidプロジェクトに非常に奇妙な問題があります。私はボタンの2次元配列を持っているし、それらにアクションリスナーを追加しようとしています。だから、これは私が持っているものです。多くのボタンにリスナーを追加リソース

for (i = 0; i<buttons.length;i++) 
     { 
      for (k = 0; k<buttons[i].length;k++) 
      { 
       String but = "mtp" + i + k; 
       buttons[i][k] = (Button)v.findViewWithTag(but); 
       if (k%2 == 0) 
       { 
        buttons[i][k].setOnClickListener(new View.OnClickListener() { 
         public void onClick(View v) { 
          text.setText(words[w]); 
          w++; 
         } 
        }); 
       } 
       else 
       { 

        buttons[i][k].setOnClickListener(new View.OnClickListener() { 
         public void onClick(View v) { 
          int res = getResources().getIdentifier(icons[p],"drawable", getPackageName()); 
          buttons[i][k].setBackgroundResource(res); 
          p++; 
         } 
        }); 


       } 
      } 
     } 

奇妙なことは、私の最初のアクションリスナーが正常に動作していることです。これは、TextViewを正しく変更します。しかし、2番目のアプリケーションがクラッシュします。さらに、ループ内ではなくアクションリスナーを設定すると、次のようになります。

buttons[0][1].setOnClickListener(new View.OnClickListener() { 
         public void onClick(View v) { 
          int res = getResources().getIdentifier(icons[p],"drawable", getPackageName()); 
          buttons[0][1].setBackgroundResource(res); 
          p++; 
         } 
        }); 

これはうまく動作します。 私は何をしますか?どうすればこの問題を解決できますか?

+0

あなたの質問を理解するのは難しいです,,,,,実際に何をしたいですか? –

+0

LOGCATを表示できますか? –

+0

クラッシュのスタックトレースを表示します。また、既にボタンの2D配列を持っている場合、なぜ 'findViewWithTag'でそれらを見つける必要がありますか? – kabuko

答えて

0

まず、(new View.OnClickListener()実装内側)匿名クラスでik変数を使用することはできません。

また、text変数(私が見るようにいくつかのTextViewオブジェクトへの参照として)も最終的でなければならないので、すべての繰り返しで同じTextViewを参照します。

とのonClick()ハンドラが呼び出されますとき、ik変数は無効となりますので、あなたは

((Button)view).setBackgroundResource(res); 

ようなもので

buttons[i][k].setBackgroundResource(res); 

を変更する必要があります。 しかし、という名前のonClick()引数は、ビューへの実際の参照がクリックされています。

+0

ありがとう、これは本当に助けになりました –

0

これらのボタンはXMLファイルにありますか?または、プログラムでそれをやろうとしていますか?アクティビティでOnClickListenerを実装できるためです。

は、ここで代替

XMLです:

<Button 
android:id="@+id/button1" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:onClick="button1" 
android:text="@string/button1" /> 

のJava:

public class YOUNAMEHERE extends Activity implements OnClickListener { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 
public void button1 (View v) { 
    *The things you want to happen when the button is pressed* 
} 

これは、あなたが書かなければならないコードの量を短縮し、すべてが事前に実装されているので読みやすいです。

これは本当に完全にあなたの質問に答えるわけではありませんが、私はそれが助けてくれることを願っています。これは今までJavaでAndroidをコーディングすることについて私が知っていることです。それはfinalとして宣言されるまで、すべての

+0

まだ動作しません:( –

関連する問題