我正在创建一个反馈输入表单,用于从单选按钮中选择用户,就像下面的图像一样。
所以我采用了表格布局,并在第一行添加了带有固定宽度textview的表格行,并为其余行添加了固定宽度的单选按钮的textview
这是布局代码:
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableLayout
android:showDividers="middle"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TableRow>
<TextView
android:id="@+id/name"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text=""/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Excellent"/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Very Good"/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Good"/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Okay"/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Bad"/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Very Bad"/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Worst"/>
</TableRow>
<TableRow>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Food Quality"/>
<RadioButton
android:layout_width="100dp"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
</TableRow>
<TableRow>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Food Quality"/>
<RadioButton
android:layout_width="100dp"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
</TableRow>
<TableRow>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Food Quality"/>
<RadioButton
android:layout_width="100dp"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
<RadioButton
android:layout_width="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
</TableRow>
</TableLayout>
</HorizontalScrollView>
这给了我这样的输出(可水平滚动)
问题是
由于我只添加了没有无线电组的单选按钮,因此用户可以在一行中选择所有不应该发生的单选按钮。
如果添加无线电组,则单选按钮与第一行的文本视图(标签)无法正确对齐。
任何人都可以帮助我。
答案 0 :(得分:0)
您可以使用实施OnCheckedChangeListener
来解决此问题尝试以下代码,它将适合您 -
rb1 = (RadioButton) findViewById(R.id.rb1);
rb1.setOnCheckedChangeListener(quest1);
rb2 = (RadioButton) findViewById(R.id.rb1);
rb2.setOnCheckedChangeListener(quest1);
rb3 = (RadioButton) findViewById(R.id.rb1);
rb3.setOnCheckedChangeListener(quest2);
rb4 = (RadioButton) findViewById(R.id.rb1);
rb4.setOnCheckedChangeListener(quest2);
CompoundButton.OnCheckedChangeListener quest1 = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switch (buttonView.getId()) {
case R.id.rb1:
rb2.setChecked(false);
break;
case R.id.rb2:
rb1.setChecked(false);
}
}
};
CompoundButton.OnCheckedChangeListener ques2= new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switch (buttonView.getId()) {
case R.id.rb3:
rb4.setChecked(false);
break;
case R.id.rb4:
rb3.setChecked(false);
}
}
};
答案 1 :(得分:0)
有时,当您无法在设计上妥协时,您必须在效率上妥协。您可以通过向所有单选按钮添加一个简单的公共OnCheckedChangeListener
来实现此目的。
public CompoundButton.OnCheckedChangeListener onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// As all radio buttons have this listener added,
// add this check to avoid repetitive execution of code and avoid ripples
if (isChecked) {
View parent = (View) buttonView.getParent();
RadioButton lastCheckedRadioButton = (RadioButton) parent.getTag();
if (lastCheckedRadioButton != null) {
lastCheckedRadioButton.setChecked(false);
}
parent.setTag(buttonView);
}
}
};
最糟糕的部分是什么?
当你将监听器添加到所有单选按钮时
如果您能想到更有效的方法,请使用您自己的解决方案,否则,请使用此代码段将侦听器添加到所有单选按钮(基于您的布局示例)。
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
View child;
TableRow tableRow;
// As the first line is headings, skip the first row
for (int i = 1; i < tableLayout.getChildCount(); i++) {
child = tableLayout.getChildAt(i);
if (child instanceof TableRow) {
tableRow = (TableRow) child;
// As the first line has labels, skip the first column
for (int j = 1; j < tableRow.getChildCount(); j++) {
child = tableRow.getChildAt(j);
if (child instanceof RadioButton) {
((RadioButton) child).setOnCheckedChangeListener(onCheckedChangeListener);
}
}
}
}
注意:如果您已将setTag
方法用于其他目的,则可以使用setTag(R.id.radioButton)
和getTag(R.id.radioButton)
来获得结果