2014-10-18 47 views
0

在我actiivty,我创建了多个复选框的项目就是这样,其中的复选框的文字是从我的SQLite数据库设置条件,在android系统

finaldb.open(); 
      String[] db_data = finaldb.getdbdata(sensIds[i]); 
      finaldb.close(); 
    for (int j = 0; j < db_data.length; j++) { 
         cb = new CheckBox(getApplicationContext()); 
         cb.setButtonDrawable(id); 
         cb.setText(db_data[j]); 
         mainLayout.addView(cb); 
       } 

未来现在,我想在设置条件我的按钮,如果任何复选框被选中,activityA应该被启动,或者在其他情况下,activityB将被启动。 我试图像这样做,

if(cb.isChecked()) { 

//ActivityA start 
} 
else { 

//ActivityB start 
} 

但它给我IndexOutOfBoundExceptionError。任何人都可以帮助我在正确的方向吗?

编辑: 当我删除我的if else条件并仅与ActivityA一起使用时,代码工作得非常好,但是当使用此if else条件时,它只考虑else条件并每次启动ActivityB。

这里是我的logcat报告,

10-18 15:10:33.065: E/AndroidRuntime(1138): FATAL EXCEPTION: main 
10-18 15:10:33.065: E/AndroidRuntime(1138): Process: com.example.mydb, PID: 1138 
10-18 15:10:33.065: E/AndroidRuntime(1138): java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at java.util.ArrayList.get(ArrayList.java:308) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at com.example.mydb.FinalActivity.onClick(FinalActivity.java:219) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at android.view.View.performClick(View.java:4438) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at android.view.View$PerformClick.run(View.java:18422) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at android.os.Handler.handleCallback(Handler.java:733) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at android.os.Handler.dispatchMessage(Handler.java:95) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at android.os.Looper.loop(Looper.java:136) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at java.lang.reflect.Method.invoke(Method.java:515) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
10-18 15:10:33.065: E/AndroidRuntime(1138):  at dalvik.system.NativeStart.main(Native Method) 
+0

此代码是误导...之间的字符串声明和循环是你的SQL查询,不是吗?否则很明显,db_data尚未初始化! – 2014-10-18 18:31:01

+0

cb = new CheckBox(getApplicationContext());而是尝试cb = new CheckBox(this); – 2014-10-18 18:36:18

+0

@SuhailMehta试过了,它没有工作 – 2014-10-18 20:44:40

回答

1

好的,如果您有多个属于同一系列的复选框,并且您希望应用条件(如果其中任何一个已选中),则ActivityA应该启动。 你可以尝试这样的事情,

for (int i = 0; i < mainLayout.getChildCount(); i++) { 
        if (mainLayout.getChildAt(i) instanceof CheckBox) { 
         CheckBox cb = (CheckBox) mainLayout.getChildAt(i); 
         if (cb.isChecked()) { 
         //Start ActivityA 
          } 
         else { 
         //Start ActivityB 
         } 
+1

从您的答案中,我得到一个提示,我应该设置一个布尔变量,如果任何复选框被选中,设置它为真,然后最后根据布尔变量状态,我可以启动我的ActivtyA或ActivityB。但有点困惑我应该如何实现这一点? – 2014-10-20 15:39:24

+0

最后,在你的回答帮助下,我让我的'if-else'条件起作用,非常感谢! – 2014-10-20 16:17:27

-1

我同意,使用断点来检查循环的每个迭代,看看数据是每个索引。也许你的getdbdata()方法有错误?

您是否仍然在复选框检查上启动活动时遇到问题?

+0

是的,问题还没有解决。我检查了我的查询,一切似乎都很好,但错误仍然存​​在 – 2014-10-18 19:54:24

+0

IndexOutOfBounds或NullBoundExceptionError? – 2014-10-18 20:04:47

+0

IndexOutOfBoundException – 2014-10-18 20:07:21

0

检查String[] db_data = finaldb.getdbdata(sensIds[i]);

误差几乎可以肯定有

注重通过

.getdbdata(sensIds[i]);` 

错误返回的值是相对于ArrayList一个只有2个元素,但你的代码试试访问位置2中的元素:第三个不存在的元素。

+0

你说得对,ArrayList有问题。 indexOutOfBoundException现在已经解决了,但是每次我运行应用程序,它的唯一启动activityB,并没有考虑我的“if”条件时,我的条件出现问题。 – 2014-10-19 05:08:04

0

@colonelcode,如果有与按钮听众的问题,那么即使ActivityB就不会启动。上司:没有足够的声望写评论,所以我必须写在一个单独的答案。