Странное радио-поведение кнопок в нескольких макетах - PullRequest
0 голосов
/ 09 мая 2018

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

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:gravity="center_horizontal">

        <LinearLayout
            android:id="@+id/frontRadioLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/frontShotIV"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:background="@drawable/border_image_bkg"
                android:src="@drawable/ic_hair_tools"
                android:scaleType="centerCrop"/>

            <RadioButton
                android:id="@+id/radioFrontImg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"/>

        </LinearLayout>

        <LinearLayout
            android:id="@+id/sideRadioLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_toRightOf="@id/frontRadioLayout"
            android:layout_marginLeft="16dp">

            <ImageView
                android:id="@+id/sideShotIV"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:background="@drawable/border_image_bkg"
                android:src="@drawable/ic_hair_tools"
                android:scaleType="centerCrop"/>

            <RadioButton
                android:id="@+id/radioSideImg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"/>

        </LinearLayout>

        <LinearLayout
            android:id="@+id/backRadioLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_toRightOf="@id/sideRadioLayout"
            android:layout_marginLeft="16dp">

            <ImageView
                android:id="@+id/backShotIV"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:background="@drawable/border_image_bkg"
                android:src="@drawable/ic_hair_tools"
                android:scaleType="centerCrop"/>

            <RadioButton
                android:id="@+id/radioBackImg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"/>

        </LinearLayout>

    </RelativeLayout>

Макет отображается правильно, но это происходит во время тестирования - все кнопки отмечены и не могут быть отключены. Я попытался упростить свой макет до этого:

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:gravity="center_horizontal">

        <ImageView
            android:id="@+id/frontShotIV"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:background="@drawable/border_image_bkg"
            android:scaleType="centerCrop"
            android:src="@drawable/ic_hair_tools" />

        <RadioButton
            android:id="@+id/radioFrontImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/frontShotIV"
            android:gravity="center_horizontal"
            android:layout_marginLeft="33dp"/>

        <ImageView
            android:id="@+id/sideShotIV"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:background="@drawable/border_image_bkg"
            android:scaleType="centerCrop"
            android:src="@drawable/ic_hair_tools"
            android:layout_toRightOf="@+id/frontShotIV"
            android:layout_marginLeft="16dp"/>

        <RadioButton
            android:id="@+id/radioSideImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/frontShotIV"
            android:gravity="center_horizontal"
            android:layout_toRightOf="@+id/frontShotIV"
            android:layout_marginLeft="46dp"/>

        <ImageView
            android:id="@+id/backShotIV"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:background="@drawable/border_image_bkg"
            android:src="@drawable/ic_hair_tools"
            android:scaleType="centerCrop"
            android:layout_toRightOf="@+id/sideShotIV"
            android:layout_marginLeft="16dp"/>

        <RadioButton
            android:id="@+id/radioBackImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/backShotIV"
            android:layout_toRightOf="@+id/sideShotIV"
            android:layout_marginLeft="46dp"/>

    </RelativeLayout>

но это все равно дает то же самое проверенное поведение. Может ли кто-нибудь помочь мне решить эту проблему с помощью переключателей раскладки для индивидуальной проверки и снятия флажка при выборе другой? Спасибо.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Если я правильно понял ваше требование. Вы хотите, чтобы пользователь мог выбрать только одно изображение из трех правых.

Тогда вы должны перейти на RadioButton с RadioGroup

Поскольку с помощью радиогруппы вы можете легко определить, какое изображение выбрано. А радиогруппа позволит пользователю выбирать только одну опцию за раз.

Вы можете выполнить этот пример и попробовать его. Activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Main4Activity">

<LinearLayout
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/frontShotIV"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="@color/colorAccentLight"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_launcher_background" />

    <ImageView
        android:id="@+id/sideShotIV"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginLeft="16dp"
        android:background="@color/colorAccentLight"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_launcher_background" />

    <ImageView
        android:id="@+id/backShotIV"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginLeft="16dp"
        android:background="@color/colorAccentLight"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_launcher_background" />
</LinearLayout>


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/layout">

    <RadioGroup
        android:id="@+id/radiogroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/radioFrontImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/frontShotIV"
            android:layout_marginLeft="60dp"
            android:gravity="center_horizontal" />


        <RadioButton
            android:id="@+id/radioSideImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/frontShotIV"
            android:layout_marginLeft="90dp"
            android:layout_toRightOf="@+id/frontShotIV"
            android:gravity="center_horizontal" />


        <RadioButton
            android:id="@+id/radioBackImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/backShotIV"
            android:layout_marginLeft="80dp"
            android:layout_marginTop="4dp" />
    </RadioGroup>
</LinearLayout>

<Button
    android:id="@+id/btnCheck"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="166dp"
    android:text="Check selected Image"/></RelativeLayout>

Activity.java:

public class Main4Activity extends AppCompatActivity {

private RadioGroup radiogroup;
private RadioButton radioFrontImg;
private RadioButton radioSideImg;
private RadioButton radioBackImg;
private RadioButton radioButton;
private Button btnCheck;
private String selectedImage;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main4);

    init();

}

private void init() {
    radiogroup = findViewById(R.id.radiogroup);
    radioFrontImg = findViewById(R.id.radioFrontImg);
    radioSideImg = findViewById(R.id.radioSideImg);
    radioBackImg = findViewById(R.id.radioBackImg);
    btnCheck = findViewById(R.id.btnCheck);
    btnCheck.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            method1();
            method2();
        }
    });
}

private void method2() {
    if (radioFrontImg.isChecked()) {
        selectedImage = "frontShotIV";
    } else if (radioSideImg.isChecked()) {
        selectedImage = "sideShotIV";
    } else if (radioBackImg.isChecked()) {
        selectedImage = "backShotIV";
    }
    Toast.makeText(getApplicationContext(), selectedImage, Toast.LENGTH_LONG).show();
    Log.e("selectedImage", selectedImage);

}

private void method1() {
    int selectedId = radiogroup.getCheckedRadioButtonId();
    radioButton = (RadioButton) findViewById(selectedId);
    if (selectedId == R.id.radioFrontImg)
        selectedImage = "frontShotIV";
  else if (selectedId == R.id.radioSideImg)
        selectedImage = "sideShotIV";
  else if (selectedId == R.id.radioBackImg)
        selectedImage = "backShotIV";
    Toast.makeText(Main4Activity.this, selectedImage, Toast.LENGTH_SHORT).show();
    Log.e("selectedImage",selectedImage);
}

}

Существует два метода, которые вы можете использовать любым из них.

0 голосов
/ 09 мая 2018

Вам необходимо поместить RadioButton в RadioGroup. Пример:

 <RadioGroup
       android:id="@+id/radioGroup1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content" >
       <RadioButton
            android:id="@+id/radioFrontImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/frontShotIV"
            android:gravity="center_horizontal"
            android:layout_marginLeft="33dp"/>
 </RadioGroup>

Из Документов Google:

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

В качестве альтернативы вы можете использовать CheckBox

Посмотрите оригинальную документацию для получения дополнительной информации:

https://developer.android.com/guide/topics/ui/controls/radiobutton?authuser=0

...