前提:
如下圖所示,這是一個導航選擇彈框。進行單項選擇,然後會監聽回調選擇的事件。問題是Android的RadioButton是一般是放在RadioGroup中進行管理的,而RadioGroup又是線性佈局,即單行有效,多行無效。如圖那種就需要兩個RadioGroup來進行合作。那麼如果進行合作呢?
效果如下
分析:
RadioGroup多行顯示其實就是兩個RadioGroup進行切換,使用RadioGroup的clearCheck()方法進行操作。
但是在使用clearCheck()之前,如果RadioGroup已經設置過監聽,執行就會報錯誤。
正確方法如下:
先調用
setOnCheckedChangeListener(null)
再調用
clearCheck()然後重新setOnCheckedChangeListener(checkedListener)
代碼
1、佈局如下:
<RadioButton
android:background="@drawable/pop_start_lv_report_bg"
android:id="@+id/user_report_rb_illegal"
android:layout_weight="1"
android:layout_width="@dimen/dp_110"
android:layout_height="@dimen/dp_35"
android:gravity="center"
android:button="@null"
android:drawablePadding="@dimen/dp_10"
android:text="違法違禁"
android:textColor="@color/white"
android:textSize="@dimen/sp_13"
tools:ignore="HardcodedText" />
<RadioButton
android:layout_weight="1"
android:background="@drawable/pop_start_lv_report_bg"
android:id="@+id/user_report_rb_obscene_porn"
android:layout_width="@dimen/dp_110"
android:layout_height="@dimen/dp_35"
android:layout_marginStart="@dimen/dp_8"
android:button="@null"
android:gravity="center"
android:text="淫穢色情"
android:textColor="@color/white"
android:textSize="@dimen/sp_13"
tools:ignore="HardcodedText" />
<RadioButton
android:layout_weight="1"
android:background="@drawable/pop_start_lv_report_bg"
android:id="@+id/user_report_rb_behavior"
android:layout_width="@dimen/dp_110"
android:layout_height="@dimen/dp_35"
android:layout_marginStart="@dimen/dp_8"
android:button="@null"
android:gravity="center"
android:text="危險行爲"
android:textColor="@color/white"
android:textSize="@dimen/sp_13"
tools:ignore="HardcodedText"/>
</RadioGroup>
<RadioGroup
android:id="@+id/user_report_rg_manhole_state_two"
android:layout_marginEnd="@dimen/dp_15"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_8"
android:orientation="horizontal">
<RadioButton
android:layout_weight="1"
android:background="@drawable/pop_start_lv_report_bg"
android:id="@+id/user_report_rb_fraud"
android:layout_width="@dimen/dp_110"
android:layout_height="@dimen/dp_35"
android:button="@null"
android:gravity="center"
android:text="廣告詐騙"
android:textColor="@color/white"
android:textSize="@dimen/sp_13"
tools:ignore="HardcodedText" />
<RadioButton
android:layout_weight="1"
android:background="@drawable/pop_start_lv_report_bg"
android:id="@+id/user_report_rb_insult"
android:layout_width="@dimen/dp_110"
android:layout_height="@dimen/dp_35"
android:layout_marginStart="@dimen/dp_8"
android:button="@null"
android:gravity="center"
android:text="侮辱謾罵"
android:textColor="@color/white"
android:textSize="@dimen/sp_13"
tools:ignore="HardcodedText"/>
<RadioButton
android:layout_weight="1"
android:background="@drawable/pop_start_lv_report_bg"
android:id="@+id/user_report_rb_other"
android:layout_width="@dimen/dp_110"
android:layout_height="@dimen/dp_35"
android:layout_marginStart="@dimen/dp_8"
android:button="@null"
android:gravity="center"
android:text="其他"
android:textColor="@color/white"
android:textSize="@dimen/sp_13"
tools:ignore="HardcodedText" />
</RadioGroup>
2、具體操作如下:
控件調用:
@InjectView(R.id.user_report_rg_manhole_state_one)
RadioGroup rgManholeStateOne;
@InjectView(R.id.user_report_rg_manhole_state_two)
RadioGroup rgManholeStateTwo;
設置監聽:
rgManholeStateOne.setOnCheckedChangeListener(new OnMyManholeStateOneCheckedChangeListener());
rgManholeStateTwo.setOnCheckedChangeListener(new OnMyManholeStateTwoCheckedChangeListener());
實現單選
private class OnMyManholeStateOneCheckedChangeListener implements RadioGroup.OnCheckedChangeListener {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int position) {
switch (position) {
case R.id.rb_intact:
if (rbIntact.isChecked())
rgManholeStateTwo.clearCheck();
break;
case R.id.rb_lose:
if (rbLose.isChecked())
rgManholeStateTwo.clearCheck();
break;
case R.id.rb_sunken:
if (rbSunken.isChecked())
rgManholeStateTwo.clearCheck();
break;
}
}
}
private class OnMyManholeStateTwoCheckedChangeListener implements RadioGroup.OnCheckedChangeListener {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int position) {
switch (position) {
case R.id.rb_occupation:
if (rbOccupation.isChecked())
rgManholeStateOne.clearCheck();
break;
case R.id.rb_damage:
if (rbDamage.isChecked())
rgManholeStateOne.clearCheck();
break;
case R.id.rb_heave:
if (rbHeave.isChecked())
rgManholeStateOne.clearCheck();
break;
}
}
}