我怎样才能把 RadioButtons 作为他们 RadioGroup 的孙子?
How can I put RadioButtons as grandchildren from their RadioGroup a good way?
我有4个RadioButtons
这样排列:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2">
<RadioButton
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button 1"/>
<RadioButton
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button 2"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2">
<RadioButton
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button 3"/>
<RadioButton
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button 4"/>
</LinearLayout>
</LinearLayout>
</RadioGroup>
</RelativeLayout>
我的问题是,现在每个 RadioButton
都可以一起按下并被选中。那不应该发生。必须始终选择一个或零个 RadioButtons
,而不是多个。在正常的RadioGroup
中,不会出现这个问题。我认为这是因为其中的 LinearLayout's
,但我的应用程序的其余部分需要它们。我该如何解决这个问题?
我怎样才能把RadioButtons
从他们RadioGroup
当成孙子的好方法呢?
我建议您不要在 RadioGroup 中使用嵌套的嵌套布局 (Linear/Relative) 来增加视图层次结构。此外,您不会使用嵌套布局获得单选功能。 RadioGroup 实际上扩展了 LinearLayout。所以它只有垂直或水平排列单选按钮的能力。在这里我分享了 link
RelativeRadioGroup
我的 Library 实际上是一个 RelativeRadioGroup 这样你就可以随意排列 RadioButtons 并且特别选择不会受到影响。
您不能在 RadioGroup 中放置任何其他布局。因此,如果您仍想将所有 RadioButton 置于线性布局中,您将不得不做一些额外的工作。
以编程方式执行,选中任何 RadioButton 时将其他 RadioButton 设为未选中。
类似
RadioButton rbu1 =(RadioButton)findViewById(R.id.radio0);
RadioButton rbu2 =(RadioButton)findViewById(R.id.radio1);
rbu1.setOnClickListener(first_radio_listener);
rbu2.setOnClickListener(second_radio_listener);
OnClickListener first_radio_listener = new OnClickListener (){
public void onClick(View v) {
rbu2.setChecked(false);
}
};
OnClickListener second_radio_listener = new OnClickListener (){
public void onClick(View v) {
rbu1.setChecked(false);
}
};
当您在 RadioGroup
中使用 LinearLayout
时,RadioGroup
失去了它的基本 functionality
到 toggle
按钮 states
以及它的覆盖方法 onCheckedChanged()
永远不会被调用。
要解决此问题,您必须更改 RadioButton
状态 programmatically
。
这是一个完整的解决方案:
public class RadioGroupActivity extends AppCompatActivity implements RadioButton.OnCheckedChangeListener {
RadioGroup radioGroup;
RadioButton radioButton1;
RadioButton radioButton2;
RadioButton radioButton3;
RadioButton radioButton4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_radio_group);
getSupportActionBar().setTitle("Hello Android");
radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
radioButton1 = (RadioButton) findViewById(R.id.button1);
radioButton2 = (RadioButton) findViewById(R.id.button2);
radioButton3 = (RadioButton) findViewById(R.id.button3);
radioButton4 = (RadioButton) findViewById(R.id.button4);
radioButton1.setOnCheckedChangeListener(this);
radioButton2.setOnCheckedChangeListener(this);
radioButton3.setOnCheckedChangeListener(this);
radioButton4.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean status) {
if (status)
{
switch (compoundButton.getId()) {
case R.id.button1:
radioButton2.setChecked(false); radioButton3.setChecked(false); radioButton4.setChecked(false);
// Do something
Toast.makeText(getApplicationContext(), radioButton1.getText() + " clicked", Toast.LENGTH_SHORT).show();
break;
case R.id.button2:
radioButton1.setChecked(false); radioButton3.setChecked(false); radioButton4.setChecked(false);
// Do something
Toast.makeText(getApplicationContext(), radioButton2.getText() + " clicked", Toast.LENGTH_SHORT).show();
break;
case R.id.button3:
radioButton1.setChecked(false); radioButton2.setChecked(false); radioButton4.setChecked(false);
// Do something
Toast.makeText(getApplicationContext(), radioButton3.getText() + " clicked", Toast.LENGTH_SHORT).show();
break;
case R.id.button4:
radioButton1.setChecked(false); radioButton2.setChecked(false); radioButton3.setChecked(false);
// Do something
Toast.makeText(getApplicationContext(), radioButton4.getText() + " clicked", Toast.LENGTH_SHORT).show();
break;
}
}
}
}
输出:
希望对你有所帮助~
我有4个RadioButtons
这样排列:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2">
<RadioButton
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button 1"/>
<RadioButton
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button 2"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2">
<RadioButton
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button 3"/>
<RadioButton
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button 4"/>
</LinearLayout>
</LinearLayout>
</RadioGroup>
</RelativeLayout>
我的问题是,现在每个 RadioButton
都可以一起按下并被选中。那不应该发生。必须始终选择一个或零个 RadioButtons
,而不是多个。在正常的RadioGroup
中,不会出现这个问题。我认为这是因为其中的 LinearLayout's
,但我的应用程序的其余部分需要它们。我该如何解决这个问题?
我怎样才能把RadioButtons
从他们RadioGroup
当成孙子的好方法呢?
我建议您不要在 RadioGroup 中使用嵌套的嵌套布局 (Linear/Relative) 来增加视图层次结构。此外,您不会使用嵌套布局获得单选功能。 RadioGroup 实际上扩展了 LinearLayout。所以它只有垂直或水平排列单选按钮的能力。在这里我分享了 link RelativeRadioGroup 我的 Library 实际上是一个 RelativeRadioGroup 这样你就可以随意排列 RadioButtons 并且特别选择不会受到影响。
您不能在 RadioGroup 中放置任何其他布局。因此,如果您仍想将所有 RadioButton 置于线性布局中,您将不得不做一些额外的工作。
以编程方式执行,选中任何 RadioButton 时将其他 RadioButton 设为未选中。
类似
RadioButton rbu1 =(RadioButton)findViewById(R.id.radio0);
RadioButton rbu2 =(RadioButton)findViewById(R.id.radio1);
rbu1.setOnClickListener(first_radio_listener);
rbu2.setOnClickListener(second_radio_listener);
OnClickListener first_radio_listener = new OnClickListener (){
public void onClick(View v) {
rbu2.setChecked(false);
}
};
OnClickListener second_radio_listener = new OnClickListener (){
public void onClick(View v) {
rbu1.setChecked(false);
}
};
当您在 RadioGroup
中使用 LinearLayout
时,RadioGroup
失去了它的基本 functionality
到 toggle
按钮 states
以及它的覆盖方法 onCheckedChanged()
永远不会被调用。
要解决此问题,您必须更改 RadioButton
状态 programmatically
。
这是一个完整的解决方案:
public class RadioGroupActivity extends AppCompatActivity implements RadioButton.OnCheckedChangeListener {
RadioGroup radioGroup;
RadioButton radioButton1;
RadioButton radioButton2;
RadioButton radioButton3;
RadioButton radioButton4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_radio_group);
getSupportActionBar().setTitle("Hello Android");
radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
radioButton1 = (RadioButton) findViewById(R.id.button1);
radioButton2 = (RadioButton) findViewById(R.id.button2);
radioButton3 = (RadioButton) findViewById(R.id.button3);
radioButton4 = (RadioButton) findViewById(R.id.button4);
radioButton1.setOnCheckedChangeListener(this);
radioButton2.setOnCheckedChangeListener(this);
radioButton3.setOnCheckedChangeListener(this);
radioButton4.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean status) {
if (status)
{
switch (compoundButton.getId()) {
case R.id.button1:
radioButton2.setChecked(false); radioButton3.setChecked(false); radioButton4.setChecked(false);
// Do something
Toast.makeText(getApplicationContext(), radioButton1.getText() + " clicked", Toast.LENGTH_SHORT).show();
break;
case R.id.button2:
radioButton1.setChecked(false); radioButton3.setChecked(false); radioButton4.setChecked(false);
// Do something
Toast.makeText(getApplicationContext(), radioButton2.getText() + " clicked", Toast.LENGTH_SHORT).show();
break;
case R.id.button3:
radioButton1.setChecked(false); radioButton2.setChecked(false); radioButton4.setChecked(false);
// Do something
Toast.makeText(getApplicationContext(), radioButton3.getText() + " clicked", Toast.LENGTH_SHORT).show();
break;
case R.id.button4:
radioButton1.setChecked(false); radioButton2.setChecked(false); radioButton3.setChecked(false);
// Do something
Toast.makeText(getApplicationContext(), radioButton4.getText() + " clicked", Toast.LENGTH_SHORT).show();
break;
}
}
}
}
输出:
希望对你有所帮助~