我的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++;
}
});
它运作得很好。 我该怎么办?我该如何解决这个问题?
答案 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
实现中)中使用k
和new View.OnClickListener()
变量,直到它声明为final
。
此外,text
变量(我可以看到对某些TextView对象的引用)也必须是最终的,因此,它将在每次迭代中引用相同的TextView。
你必须改变
buttons[i][k].setBackgroundResource(res);
类似
((Button)view).setBackgroundResource(res);
因为当调用onClick()处理程序时,i
和k
变量将无效。
但是名为view
的onClick()参数已经点击了对视图的实际引用。