在android系统中,我向所有按钮添加了onClickListener。
代码:
ArrayList<ImageButton> alfabebutonlar = new ArrayList<ImageButton>();
alfabebutonlar.add((ImageButton)findViewById(R.id.harfab));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfbb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfcb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfccb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfdb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfeb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harffb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfgb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfggb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfhb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfib));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfiib));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfjb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfkb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harflb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfmb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfnb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfob));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfoob));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfpb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfrb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfsb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfssb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harftb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfub));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfuub));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfvb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfyb));
alfabebutonlar.add((ImageButton)findViewById(R.id.harfzb));
ArrayList<String> alfabeharfler = new ArrayList<String>();
alfabeharfler.add("A");
alfabeharfler.add("B");
alfabeharfler.add("C");
alfabeharfler.add("Ç");
alfabeharfler.add("D");
alfabeharfler.add("E");
alfabeharfler.add("F");
alfabeharfler.add("G");
alfabeharfler.add("Ğ");
alfabeharfler.add("H");
alfabeharfler.add("İ");
alfabeharfler.add("I");
alfabeharfler.add("J");
alfabeharfler.add("K");
alfabeharfler.add("L");
alfabeharfler.add("M");
alfabeharfler.add("N");
alfabeharfler.add("O");
alfabeharfler.add("Ö");
alfabeharfler.add("P");
alfabeharfler.add("R");
alfabeharfler.add("S");
alfabeharfler.add("Ş");
alfabeharfler.add("T");
alfabeharfler.add("U");
alfabeharfler.add("Ü");
alfabeharfler.add("V");
alfabeharfler.add("Y");
alfabeharfler.add("Z");
for(i = 0; i < alfabebutonlar.size(); i++){
alfabebutonlar.get(i).setOnClickListener ( new View.OnClickListener () {
public void onClick(View alfabebutonv){
startActivity(getIntent().putExtra("harf", alfabeharfler.get(i)));
}
});
}
但是当我单击按钮B时,出现此错误(日志):
java.lang.IndexOutOfBoundsException:无效的索引29,大小为29
日志:
java.lang.IndexOutOfBoundsException: Invalid index 29, size is 29
E/AndroidRuntime( 4367): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
E/AndroidRuntime( 4367): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
E/AndroidRuntime( 4367): at android.app.ActivityThread.access$800(ActivityThread.java:151)
E/AndroidRuntime( 4367): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
E/AndroidRuntime( 4367): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 4367): at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime( 4367): at android.app.ActivityThread.main(ActivityThread.java:5254)
E/AndroidRuntime( 4367): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 4367): at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime( 4367): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
E/AndroidRuntime( 4367): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
E/AndroidRuntime( 4367): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 29, size is 29
E/AndroidRuntime( 4367): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
E/AndroidRuntime( 4367): at java.util.ArrayList.get(ArrayList.java:308)
E/AndroidRuntime( 4367): at com.example.xxx.xxx.alfabe.onCreate(alfabe.java:241)
E/AndroidRuntime( 4367): at android.app.Activity.performCreate(Activity.java:5990)
E/AndroidRuntime( 4367): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
E/AndroidRuntime( 4367): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
E/AndroidRuntime( 4367): ... 10 more
我将onClickListener添加到for循环中的所有按钮以保存代码。我想我出错了,因为在for循环中。
编辑:
我在循环中添加了这一行:final int index = i;我写索引给我。问题解决了。
希望您能理解
答案 0 :(得分:0)
只需确保两个数组(alfabeharfler和alfabebutonlar)且具有相同数量的元素。或者更好的方法是,如果两个数组都需要匹配大小和位置,请改用Pair
对象...
ArrayList<Pair<String, ImageButton>> list = new ArrayList<Pair<String, ImageButton>>();
list.add(new Pair("A", imageButton));
要访问特定项目...
list.get(i).first; //The letter/string
list.get(i).second; //The button
答案 1 :(得分:0)
在您的OnClick中执行此操作:
//ButtonView arraylist and data arraylist size should be same....
public void onClick(View alfabebutonv){
final int index = i;
// Ith position of buttonview should be less than the data arraylist size
// Add below check. i < alfabeharfler.size()
if( alfabeharfler != null && i < alfabeharfler.size()) {
startActivity(getIntent().putExtra("harf", alfabeharfler.get(index)));
}
}
});
}
答案 2 :(得分:0)
尝试一下:
for(i = 0; i < alfabebutonlar.size(); i++){
String value = alfabeharfler.get(i);
alfabebutonlar.get(i).setOnClickListener ( new View.OnClickListener () {
public void onClick(View alfabebutonv){
startActivity(getIntent().putExtra("harf", value));
}
});
}
答案 3 :(得分:0)
在您的方法onClick()中,它引用了您的“ i”变量,其最后一个值为29,这是它在循环中中断的时间,因此当您调用
alfabeharfler.get(i)
,它在您所有的调用中都使用值29,而不仅仅是在您单击按钮B时,因此,您得到了“ IndexOutOfBoundsException”异常。
尝试在循环中声明一个新的最终变量,然后在onClick方法中使用该变量,类似这样的事情(我没有尝试过此代码,但它应该可以工作):
for(i = 0; i < alfabebutonlar.size(); i++){
final int index = i;
alfabebutonlar.get(index).setOnClickListener ( new View.OnClickListener () {
public void onClick(View alfabebutonv){
startActivity(getIntent().putExtra("harf", alfabeharfler.get(index)));
}
});
}
希望这会有所帮助。
答案 4 :(得分:0)
请勿在侦听器内部访问i。当for循环运行时,i递增到29(28个元素)并退出。这时不执行侦听器。当您单击按钮时,将使用值29来访问i,因此将显示错误。在for循环外的按钮和标签之间创建最终映射,并从侦听器中获取它,以检索和使用标签值。