2012-07-29 33 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;每個案例結束時都會有 。

相關問題