TableLayout радиогрупп с соответствующими метками, выровненными в android

Я создаю форму ввода обратной связи, которая выбирает пользователя из переключателей, как показано ниже.

Желаемый результат

Поэтому я взял макет таблицы и добавил строки таблицы с текстовыми представлениями фиксированной ширины в первой строке и текстовым представлением с переключателями фиксированной ширины для остальных строк.

Вот код макета:

   <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>

Что дает мне такой вывод (с горизонтальной прокруткой)

Полученный результат

Проблема

Поскольку я добавил только переключатели без радиогруппы, пользователь может выбрать все переключатели в одной строке, чего не должно происходить.

Если я добавлю радиогруппу, переключатели не будут правильно выравниваться с текстовыми представлениями (метками) первой строки.

Может кто-нибудь помочь мне.


person Manikanta    schedule 01.11.2016    source источник
comment
Вы можете просто сделать общую функцию для всех переключателей, чтобы снять флажок. Когда пользователь нажимает на любую кнопку-переключатель, сначала снимите все остальные кнопки-переключатели с помощью общей функции, затем используйте setChecked для кнопки, на которую нажал пользователь :) просто   -  person Rahul Khurana    schedule 01.11.2016
comment
Тогда все переключатели в других строках будут сняты. Если мне нужно реализовать ваше решение, мне нужно сохранить карту списка переключателей и выполнить эту операцию, которую я считаю неэффективной...   -  person Manikanta    schedule 01.11.2016
comment
дорогой @Manikanta, вы также можете поддерживать общую функцию для каждой строки.   -  person Rahul Khurana    schedule 01.11.2016
comment
дорогой @RahulKhurana, я чувствую, что это наивный подход....   -  person Manikanta    schedule 01.11.2016
comment
Затем для этого вы можете использовать RadioGroup, который вы не хотите использовать   -  person Rahul Khurana    schedule 01.11.2016
comment
Я очень хорошо использую радиогруппу, но переключатели не выравниваются должным образом с метками первой строки. Основная проблема здесь в том, что центр тяжести для радиокнопки не работает для радиокнопки.   -  person Manikanta    schedule 01.11.2016
comment
Так что ты хочешь?? Можем ли мы использовать любую волшебную палочку? Просто сначала проясните свое состояние в своем уме   -  person Rahul Khurana    schedule 01.11.2016
comment
Давайте продолжим это обсуждение в чате.   -  person Manikanta    schedule 01.11.2016
comment
Вот мой ответ на подобные вопросы. Пожалуйста, обратитесь по ссылке. stackoverflow.com/a/48395521/9255006   -  person Zankrut Parmar    schedule 23.01.2018


Ответы (2)


Вы можете просто решить эту проблему с помощью реализации 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);
        }
    }
};
person Amit Bhati    schedule 01.11.2016
comment
OMG, у меня есть 8 вопросов каждый вопрос с 8 переключателями. то с вашим решением я в конечном итоге пишу много избыточного кода.. - person Manikanta; 01.11.2016
comment
Если вы не используете радиогруппу, это будет альтернативное решение. Также вы можете создать 8 объектов для checkChangeListner для 8 вопросов. что уменьшит ваш код, я обновлю свой ответ для вас - person Amit Bhati; 01.11.2016
comment
Я в порядке с использованием радиогруппы. но как разобраться с выравниванием - person Manikanta; 01.11.2016
comment
@Manikanta я обновил свой ответ, теперь он поможет вам писать меньше кода - person Amit Bhati; 01.11.2016

Иногда, когда вы не можете пойти на компромисс в отношении дизайна, вы должны пойти на компромисс в отношении эффективности. Вы можете добиться этого, добавив простой общий 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) для достижения результата.

person Rehan    schedule 01.11.2016