2017-04-10 175 views
0

我有一個測驗應用程序,每個問題有4個答案,其中2個是正確的。我使用CheckBox來獲得答案。我想要的是,當用戶點擊2個答案時,剩下的2個就會被取消選中。換句話說,當時只有2個選中了CheckBox,並且如果用戶有2個選中並檢查了第三個,那麼選中的其中一個取消選中。我寫了一個代碼,它是「半工半讀」的。當我檢查複選框從第一個到最後開始工作,但從最後點擊到第一,沒有任何反應......Check 4 of 4複選框

public void checkBoxClicked(View view) { 

    switch (view.getId()) { 

     case R.id.checkBoxOne: 
      case R.id.checkBoxTwo: 
       case R.id.checkBoxThree: 
        case R.id.checkBoxFour: 
      if (checkBoxOne.isChecked() && checkBoxTwo.isChecked()) { 
       checkBoxThree.setEnabled(false); 
       checkBoxFour.setEnabled(false); 
      }else { 
       checkBoxThree.setEnabled(true); 
       checkBoxFour.setEnabled(true); 
      } 
      if (checkBoxOne.isChecked() && checkBoxThree.isChecked()) { 
       checkBoxTwo.setEnabled(false); 
       checkBoxFour.setEnabled(false); 
      }else { 
       checkBoxTwo.setEnabled(true); 
       checkBoxFour.setEnabled(true); 
      } 
      if (checkBoxOne.isChecked() && checkBoxFour.isChecked()) { 
       checkBoxTwo.setEnabled(false); 
       checkBoxThree.setEnabled(false); 
      }else { 
       checkBoxTwo.setEnabled(true); 
       checkBoxThree.setEnabled(true); 
      } 
      if (checkBoxTwo.isChecked() && checkBoxThree.isChecked()) { 
       checkBoxOne.setEnabled(false); 
       checkBoxFour.setEnabled(false); 
      }else { 
       checkBoxOne.setEnabled(true); 
       checkBoxFour.setEnabled(true); 
      } 
      if (checkBoxTwo.isChecked() && checkBoxFour.isChecked()) { 
       checkBoxOne.setEnabled(false); 
       checkBoxThree.setEnabled(false); 
      }else { 
       checkBoxOne.setEnabled(true); 
       checkBoxThree.setEnabled(true); 
      } 
      if (checkBoxThree.isChecked() && checkBoxFour.isChecked()) { 
       checkBoxOne.setEnabled(false); 
       checkBoxTwo.setEnabled(false); 
      }else { 
       checkBoxOne.setEnabled(true); 
       checkBoxTwo.setEnabled(true); 
      } 
         break; 

回答

0

我會嘗試跟蹤正在使用數組,檢查箱(一隊列將爲此完美工作)。當用戶點擊一個複選框時,檢查你的數組是否有兩個條目。如果它少於2個條目,則將新複選框添加到列表中。如果它有兩個條目,請從列表中刪除第一個複選框,然後添加新複選框。

在您的跟蹤代碼之後,您可以取消選中所有複選框並僅檢查您需要的那些複選框。

這裏我使用一個ArrayList爲了簡單,但即使是一個簡單的數組也可以工作。你也可以使用id而不是實際的視圖。

***更新非常簡單的工作示例。

活動

public class TestActivity extends AppCompatActivity implements View.OnClickListener{ 

    private ArrayList<CheckBox> mChecks; 
    private ArrayList<CheckBox> mSelectedChecks; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.test_layout); 

     mChecks = new ArrayList<CheckBox>(); 
     mSelectedChecks = new ArrayList<CheckBox>(); 

     //Load All checkboxes 
     CheckBox check1 = (CheckBox)findViewById(R.id.check1); 
     CheckBox check2 = (CheckBox)findViewById(R.id.check2); 
     CheckBox check3 = (CheckBox)findViewById(R.id.check3); 
     CheckBox check4 = (CheckBox)findViewById(R.id.check4); 

     //Add to tracking list 
     mChecks.add(check1); 
     mChecks.add(check2); 
     mChecks.add(check3); 
     mChecks.add(check4); 

     //Add Click listener 
     for(CheckBox c : mChecks) { 
      c.setOnClickListener(this); 
     } 

    } 

    @Override 
    public void onClick(View view) { 
     CheckBox c = (CheckBox)view; 

     if(mSelectedChecks.contains(c)) { 
      mSelectedChecks.remove(c); 
     } else { 
      if(mSelectedChecks.size() < 2) { 
       mSelectedChecks.add(c); 
      } else { 
       mSelectedChecks.remove(0); 
       mSelectedChecks.add(c); 
      } 
     } 

     drawResults(); 
    } 

    public void drawResults() { 
     for(CheckBox c : mChecks) { 
      c.setChecked(mSelectedChecks.contains(c)); 
     } 
    } 
} 

版式文件

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 


<CheckBox 
    android:text="Check 1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/check1"/> 

<CheckBox 
    android:text="Check 2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/check2"/> 

<CheckBox 
    android:text="Check 3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/check3"/> 

<CheckBox 
    android:text="Check 4" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/check4"/> 

</LinearLayout> 
+0

我是一個初學者。我試圖複製/粘貼你的代碼,但那不起作用......我現在在學Java,而且我只知道基本的東西。如果您可以發佈一些我可以用於我的案例的代碼,我將不勝感激。 –

+0

我會盡量發表一個完整的例子。 – Jlange

+0

看到我的更新,我測試了這個工程。我改進了我的原始示例,繪製時不應該閃爍。 – Jlange