2012-01-30 92 views
1

我已經成功地在xml中創建並使用過RadioGroup,但每次都有一組連續的單選按鈕,都在同一個LinearLayout中。現在我想定義一組單選按鈕作爲組的一部分,但它們的佈局不一樣。該組我的開始和結束碼是:RadioGroup可以跨越多個佈局嗎?

START:

<RadioGroup android:id="@+id/radioGroup1" > 

END:

</RadioGroup> 

如果我把這個圍繞每個按鈕單獨,然後再編譯,但按鍵別t充當單選按鈕(即激活一個沒有關閉其他按鈕)。如果我嘗試在任何按鈕之前放置「開始」,並在最後一個按鈕之後放置「結束」,則會出現編譯錯誤。

回答

3

將RadioButtons存儲在一個數組中。不必將它們分組到RadioGroup中,而必須自己啓用/禁用它們。 (未經測試,因此沒有複製/粘貼)

聲明這些變量

private ArrayList<RadioButton> mGroup = new ArrayList<RadioGroup>(); 
private CompoundButton.OnCheckedChangeListener mListener = new CompoundButton.OnCheckedChangeListener() 
{ 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
    { 
     for(RadioButton btn : mGroup) 
      btn.setChecked(false); 

     buttonView.setChecked(true); 
    } 
} 

某處在您的活動:

mGroup.add(your radiobuttons); // e.g. (RadioButton)findViewById(R.id.radio_button1); 
mGroup.add(another radiobutton); 

for(RadioButton btn : mGroup) 
    btn.setOnCheckedChangeListener(mListener) 

也許你選中/取消選中後無效的按鈕,來導致重繪

2

不幸的是,SDK不直接支持這樣做,您需要創建一個自定義「組」來管理按鈕。

每個RadioButton的所有互斥邏輯都由RadioGroup管理,因此所有按鈕都必須添加到同一組中。 RadioGroupLinearLayout的一個子類,所以這固有意味着它們也需要全部處於相同的佈局。 RadioGroup通過迭代其子代來管理每個按鈕的檢查狀態,這就是爲什麼兩個人不能離婚的原因。

Here is a linkRadioGroup源代碼爲起點,您可以創建一個使用相同的邏輯在這裏來管理這些按鈕是爲了他們自己的配置狀況檢查分離狀態的自定義管理器。 RadioGroup基本上只是爲RadioButton的每個孩子註冊爲OnCheckedChangeListener,然後根據用戶事件控制所有按鈕的檢查狀態。

HTH

1

這裏是Entreco代碼的第一部分的完善和測試的版本:

final ArrayList<RadioButton> mGroup = new ArrayList<RadioButton>(); 
    CompoundButton.OnCheckedChangeListener mListener = new CompoundButton.OnCheckedChangeListener() 
    { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
     { 
      for(RadioButton btn : mGroup) { 
       if (buttonView.getId() != btn.getId() && isChecked) { 
        btn.setChecked(false); 
       } 
      } 
     } 
    }; 

將取消只有其他按鈕和只有在按下按鈕的狀態從選中變爲檢查。

1

@Entreco答案可能會導致遞歸調用onCheckedChanged,由@Twilite答案修復。

但@Twilite答案也有問題,這是沒有顯式ID的視圖的id可能不是唯一的。如果發生這種情況,您可能會看到多個選定的單選按鈕或者沒有選中它們。因此,爲每一個設置一個唯一的ID或唯一的標籤更安全:

@Override 
    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 

     if (isChecked) { 

      for (RadioButton btn : mGroup) 
       if (!btn.getTag().equals(compoundButton.getTag())) 
        btn.setChecked(false); 

     } 
    }