具有在android中对齐的相应标签的radiogroup的TableLayout

Posted

技术标签:

【中文标题】具有在android中对齐的相应标签的radiogroup的TableLayout【英文标题】:TableLayout of radiogroup(s) with respective label(s) aligned in android 【发布时间】:2017-03-14 06:24:34 【问题描述】:

我正在创建一个反馈输入表单,它从单选按钮中获取用户选择,如下图所示。

所以我采用了表格布局并在第一行添加了带有固定宽度的文本视图的表格行,并在其余行添加了一个带有固定宽度单选按钮的文本视图

这是布局代码:

   <HorizontalScrollView
    android:layout_
    android:layout_>

    <TableLayout
        android:showDividers="middle"
        android:layout_
        android:layout_>

        <TableRow>

            <TextView
                android:id="@+id/name"
                android:layout_
                android:layout_
                android:text=""/>


            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center_horizontal"
                android:text="Excellent"/>


            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center_horizontal"
                android:text="Very Good"/>


            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center_horizontal"
                android:text="Good"/>


            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center_horizontal"
                android:text="Okay"/>


            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center_horizontal"
                android:text="Bad"/>


            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center_horizontal"
                android:text="Very Bad"/>


            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center_horizontal"
                android:text="Worst"/>

        </TableRow>

        <TableRow>

            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:text="Food Quality"/>


                <RadioButton
                    android:layout_
                    android:gravity="center_horizontal"
                    android:layout_gravity="center_horizontal"
                    android:layout_ />
                <RadioButton
                    android:layout_
                    android:gravity="center_horizontal"
                    android:layout_gravity="center_horizontal"
                    android:layout_ />
                <RadioButton
                    android:layout_
                    android:gravity="center_horizontal"
                    android:layout_gravity="center_horizontal"
                    android:layout_ />
                <RadioButton
                    android:layout_
                    android:gravity="center_horizontal"
                    android:layout_gravity="center_horizontal"
                    android:layout_ />

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />


        </TableRow>

        <TableRow>

            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:text="Food Quality"/>

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />
            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />
            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />
            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />


        </TableRow>

        <TableRow>

            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:text="Food Quality"/>

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />
            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />
            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />
            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />

            <RadioButton
                android:layout_
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:layout_ />


        </TableRow>
    </TableLayout>


</HorizontalScrollView>

这给了我这样的输出(水平滚动)

问题是

由于我只添加了单选按钮而没有单选按钮,因此用户能够在单行中选择所有单选按钮,这是不应该发生的。

如果我添加单选组,单选按钮未与第一行的文本视图(标签)正确对齐。

谁能帮帮我。

【问题讨论】:

您可以简单地为所有单选框创建一个通用功能以取消选中。当用户单击任何单选按钮时,首先通过常用功能取消选中所有其他单选按钮,然后在用户单击的单选按钮上使用 setChecked :) 简单 那么其他行中的所有单选按钮都将被取消选中。如果我需要实施您的解决方案,我需要保留单选按钮列表的地图并执行我认为不是有效方式的操作... 亲爱的@Manikanta,您也可以为每一行维护一个通用函数 亲爱的@RahulKhurana,我觉得这是一种天真的方法...... 那么你可以使用你不想使用的 RadioGroup 【参考方案1】:

您可以通过实现 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);
        
    
;

【讨论】:

天啊,我有 8 个问题,每个问题都有 8 个单选按钮。然后用你的解决方案我最终写了很多冗余代码.. 如果您不使用无线电组,那么这将是替代解决方案。您还可以为 8 个问题为 checkChangeListner 创建 8 个对象。这将减少你的代码,我会为你更新我的答案 我可以使用广播组。但是我该如何解决对齐问题 @Manikanta 我现在更新了我的答案,它将帮助您编写更少的代码【参考方案2】:

有时,当您无法在设计上妥协时,您必须在效率上妥协。您可以通过向所有单选按钮添加一个简单的通用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);
        
    
;

最糟糕的部分是什么? 当您将侦听器添加到所有单选按钮时。 如果您能想到更有效的方法,请使用您自己的解决方案,否则,请使用此 sn-p 将侦听器添加到所有单选按钮(基于您的布局示例)。

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)来达到效果

【讨论】:

以上是关于具有在android中对齐的相应标签的radiogroup的TableLayout的主要内容,如果未能解决你的问题,请参考以下文章

将单选按钮与相应的标签对齐

如何在Android中左对齐TabLayout的标签文本

具有多行标签的窗体中的垂直对齐(水平放置标签-输入)

Android垂直对齐文本和小部件

如何让一组标签在iOS中对齐?

matplotlib:在堆叠散点图中对齐 y 轴标签