2012-07-29 61 views
0

因此,我试图设置一系列复选框,单击时会添加一个数字,具体取决于复选框,以指向int变量attackTotal或damageTotal,它将在某些文本视图中显示。那么,为什么我的开关盒会影响以下所有情况?

但是,目前,单击顶部复选框的行为就好像我点击了它以及switch语句后的每个复选框。第二个点击框似乎自动激活,以及所有以下的点击,等等...

所以这里是我在一起的代码。

public void onCheckboxClicked(View v) { 
    // Is the view now checked? 
    boolean checked = ((CheckBox) v).isChecked(); 


    // Check which checkbox was clicked 
    switch(v.getId()) { 

    case R.id.checkBox1: 
     if (checked) 
       { 
       flankAttack=2; 
       } 

     else 
       { 
       flankAttack=0; 
       } 

    case R.id.checkBox2: 
     if (checked) 
       { 
       pbs=1;     
       } 
     else 
       { 
       pbs=0; 
       } 

下一路..

 case R.id.checkBox10: 
      if (checked) 
      { 
       attackTotal=attack+flankAttack+pbs; 
       damageTotal=damage+pbs; 

       TextView textView = (TextView) findViewById(R.id.textView2); 
       TextView textView2 = (TextView) findViewById(R.id.textView4); 
       textView.setText(Integer.toString(attackTotal)); 
       textView2.setText(Integer.toString(damageTotal)); 
      } 
      else 
      { 
       attackTotal=attack+flankAttack+pbs; 
       damageTotal=damage+pbs; 

       TextView textView = (TextView) findViewById(R.id.textView2); 
       TextView textView2 = (TextView) findViewById(R.id.textView4); 
       textView.setText(Integer.toString(attackTotal)); 
       textView2.setText(Integer.toString(damageTotal)); 
      } 

我才开始试图找出上周五这种编程的东西,所以要温柔。

回答

3

只是case R.id.checkBox2:前从switch语句中断开。否则,任何遇到R.id.checkBox1的东西都会继续,并执行R.id.checkBox2的所有逻辑。 (在所有其他情况下,您还需要break;)。

+0

从这个以及所有其他的回答中,我怀疑我的问题确实是缺乏休息。我会把这些信息放回去,让大家知道该程序是如何工作的。谢谢! – 2012-07-29 20:33:17

+0

这工作得很好!除了最后一个给我带来一些麻烦的案例。尽管我会把它作为一个新问题发布,因为我不认为它是相关的。 – 2012-07-29 23:25:00

+1

@RobHodgson,在你去问一个新问题之前,你如何尝试**调试**? – 2012-07-30 00:20:26

0

您在每个case之后忘记了break声明。它每次都会进入下一个案例。另外,我强烈建议不要在case语句中放置超过几行代码,否则它变得非常快速难以处理。相反,将每个案例分解成它自己的方法。通常它会很容易想出一个好名字每一个是自我记录:

switch (foo) { 
    case 0: 
     do(); 
     lots(); 
     of(); 
     things(); 
     break; 
    case 1: 
     do(); 
     other(); 
     things(); 
     break; 
    case 2: 
     if (ugly) 
     { 
      this_gets(); 
      messy(); 
      quickly(); 
     } 
     else 
     { 
      we_could(); 
      do_better(); 
     } 
     break; 
} 

变成了:你需要有一个break;告诉程序

void do_case_0() { 
    do(); 
    lots(); 
    of(); 
    things(); 
} 

void do_case_1() { 
    do(); 
    other(); 
    things(); 
} 

void do_case_2() { 
    if (ugly) 
    { 
     this_gets(); 
     messy(); 
     quickly(); 
    } 
    else 
    { 
     we_could(); 
     do_better(); 
    } 
} 


// ... 
    switch (foo) { 
     case 0: do_case_0(); break; 
     case 1: do_case_1(); break; 
     case 2: do_case_2(); break; 
    } 
+0

一个人如何“将自己的方法拉出来”?我很抱歉,如果这是一个令人难以置信的新问题,我就像一个没有经验的程序员一样。 – 2012-07-29 20:31:14

+0

@RobHodgson编辑显示我的意思。每个'case'语句的代码变成了它自己的方法(函数)。我在switch语句中调用了该方法,使它更清晰,更易于遵循。 – 2012-07-30 00:28:54

1

你忘了加入 break;每个案例结束时都会有 。

相关问题