Android将Listener与资源添加到许多按钮

时间:2012-03-21 18:07:02

标签: java android

我的Android项目有一个非常奇怪的问题。我有一个2D数组按钮,我正在尝试添加动作监听器。所以这就是我所拥有的:

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++;
                        }
                   });


               }
           }
       }

奇怪的是我的第一个动作Listener工作得很好。它正确地更改了TextView。但第二个崩溃我的应用程序。此外,当我设置一个动作监听器不在循环中但在其外部时,如:

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++;
                        }
                   });

它运作得很好。 我该怎么办?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

这些按钮是否在您的XML文件中?或者您是否尝试以编程方式执行此操作?因为您可以使用Activity实现OnClickListener。

这是另一种选择

XML:

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

爪哇:

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代码。

答案 1 :(得分:0)

首先,您不能在匿名类(i实现中)中使用knew View.OnClickListener()变量,直到它声明为final

此外,text变量(我可以看到对某些TextView对象的引用)也必须是最终的,因此,它将在每次迭代中引用相同的TextView。

你必须改变

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

类似

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

因为当调用onClick()处理程序时,ik变量将无效。 但是名为view的onClick()参数已经点击了对视图的实际引用。