Button (Кнопка)
Кнопка — один из самых распространенных элементов управления в программировании. Наследуется от TextView и является базовым классом для класса СompoundButton. От класса CompoundButton в свою очередь наследуются такие элементы как CheckBox, ToggleButton и RadioButton. В Android для кнопки используется класс android.widget.Button. На кнопке располагается текст и на кнопку нужно нажать, чтобы получить результат. Альтернативой ей может служить компонент ImageButton (android.widget.ImageButton), у которого вместо текста используется изображение.
В студии кнопка представлена компонентом Button в разделе Widgets. Управлять размером шрифта, цветом текста и другими свойствами можно через атрибут textAppearance, который задействует системные стили. Выпадающий список данного свойства содержит огромный перечень вариантов. Также вы можете вручную задать конкретные индивидуальные настройки через отдельные свойства.
Если вы растягиваете кнопку по всей ширине экрана (android:layout_width=»match_parent»), то дополнительно рекомендую использовать атрибут android:layout_margin (или родственные ему layout_marginRight и layout_marginLeft) для создания отступов от краев экрана (веб-мастера знакомы с этими терминами).
Так как кнопка является наследником TextView, то использует многие знакомые атрибуты: textColor, textSize и др.
Три способа обработки событий нажатий на кнопку
Если вы разместили на экране кнопку и будете нажимать на неё, то ничего не произойдёт. Необходимо написать код, который будет выполняться при нажатии. Существует несколько способов обработки нажатий на кнопку.
Первый способ — атрибут onClick
Относительно новый способ, специально разработанный для Android — использовать атрибут onClick (на панели свойств отображается как On Click):
android:onClick="onMyButtonClick"
Имя для события можно выбрать произвольное, но лучше не выпендриваться. Далее нужно прописать в классе активности придуманное вами имя метода, который будет обрабатывать нажатие. Метод должен быть открытым (public) и с одним параметром, использующим объект View. Вам нужно выучить пять слов для создания метода, а сам метод поместить в класс (если вы ещё путаетесь в структуре Java-кода, то вставьте метод перед последней фигурной скобкой):
public void onMyButtonClick(View view) < // выводим сообщение Toast.makeText(this, "Зачем вы нажали?", Toast.LENGTH_SHORT).show(); >
Когда пользователь нажимает на кнопку, то вызывается метод onMyButtonClick(), который в свою очередь генерирует всплывающее сообщение.
Обратите внимание, что при подобном подходе вам не придётся даже объявлять кнопку через конструкцию (Button)findViewById(R.id.button1), так как Android сама поймёт, что к чему. Данный способ применим не только к кнопке, но и к другим элементам и позволяет сократить количество строк кода.
Данный способ не будет работать в фрагментах. Кнопка должна быть частью активности, а не фрагмента.
Второй способ — метод setOnClickListener()
Более традиционный способ в Java — через метод setOnClickListener(), который прослушивает нажатия на кнопку. Так как для начинающего программиста код может показаться сложным, то рекомендуется использовать подсказки студии. Вот как это будет выглядеть. Предположим, у вас на экране уже есть кнопка button. В коде вы объявляете её обычным способом:
Button button = (Button) findViewById(R.id.button);
Следующий шаг — написание метода для нажатия. Напечатайте имя элемента и поставьте точку button. — среда разработки покажет вам список доступных выражений для продолжения кода. Вы можете вручную просмотреть и выбрать нужный вариант, а можно продолжать набирать символы, чтобы ускорить процесс. Так как с нажатиями кнопок вам часто придётся работать, то запомните название его метода (хотя бы первые несколько символов) — набрав четыре символа (seto), вы увидите один оставшийся вариант, дальше можно сразу нажать клавишу Enter, не набирая оставшиеся символы. У вас появится строка такого вида:
button.setOnClickListener()
Курсор будет находиться внутри скобок и появится подсказка OnClickListener l. Начинайте набирать new OnClickListener. Здесь также не обязательно набирать имя полностью. Набрав слово Oncl, вы увидете нужный вариант и снова нажимайте Enter. В результате вы получите готовую заготовку для обработки нажатия кнопки:
button.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < >>);
Теперь у вас есть рабочая заготовка и сразу внутри фигурных скобок метода onClick() вы можете писать свой код. Рекомендую потренироваться и набить руку в создании заготовки. Это не так сложно, и с практикой навык закрепится автоматически.
Как вариант, можно вынести код для OnClickListener в отдельное место, это удобно, когда кнопок на экране несколько и такой подход позволит упорядочить код. Удалите предыдущий пример и начните писать код заново. Принцип такой же, немного меняется порядок. В предыдущем примере мы сразу прописали в методе setOnClickListener слушателя new OnClickListener. с методом onClick(). Можно сначала отдельно объявить отдельную переменную myButtonClickListener:
OnClickListener myButtonClickListener = new OnClickListener() < @Override public void onClick(View v) < >>;
Во время набора активно используйте подсказки через Ctrl+Space. Набрали несколько символов у первого слова и нажимайте эту комбинацию, набрали после слова new несколько символов и снова нажимайте указанную комбинацию — заготовка будет создана за несколько секунд, а вы избежите возможных опечаток.
У нас есть готовая переменная, и теперь, когда вы будете набирать код button.setOnClickListener, то вместо new OnClickListener впишите готовую переменную.
Для новичка описание может показаться сумбурным и не понятным, но лучше самостоятельно проделать эти операции и понять механизм.
Третий способ — интерфейс OnClickListener
Третий способ является родственным второму способу и также является традиционным для Java. Кнопка присваивает себе обработчика с помощью метода setOnClickListener (View.OnClickListener l), т.е. подойдет любой объект с интерфейсом View.OnClickListener. Мы можем указать, что наш класс Activity будет использовать интерфейс View.OnClickListener.
Опять стираем код от предыдущего примера. Далее после слов extends Activity дописываем слова implements OnClickListener. При появлении подсказки не ошибитесь. Обычно первым идёт интерфейс для диалогов, а вторым нужный нам View.OnClickListener.
Название вашего класса будет подчёркнуто волнистой красной чертой, щёлкните слово public и дождитесь появления красной лампочки, выберите вариант Implement methods. Появится диалоговое окно с выделенным методом onClick. Выбираем его и в коде появится заготовка для нажатия кнопки.
@Override public void onClick(View v)
Метод будет реализован не в отдельном объекте-обработчике, а в Activity, который и будет выступать обработчиком. В методе onCreate() присвоим обработчик кнопке. Это будет объект this, т.е. текущий объект нашей активности.
button.setOnClickListener(this);
На первых порах такой способ также покажется вам сложным и непонятным. Со временем и опытом понимание обязательно придёт.
Лично я рекомендую вам использовать первый способ, как самый простой и понятный. Использование второго и третьего способа дадут вам представление, как писать обработчики для других событий, так как кнопка может иметь и другие события. Например, кроме обычного нажатия существует долгое нажатие на кнопку (long click). Один из таких примеров с методом касания я привёл в конце этой статьи.
О том, как обрабатывать щелчки кнопки я написал отдельную статью Щелчок кнопки/Счетчик ворон. Также кнопки часто будут встречаться во многих примерах на сайте. Про обработку длительный нажатий можно прочитать в статье, посвященной ImageButton.
Плодитесь и размножайтесь — это про кошек, а не про кнопки
Когда у вас одна кнопка в окне, то у вас будет один метод, две кнопки — два метода и так далее. Если у вас несколько кнопок, то не обязательно для каждой прописывать свой метод, можно обойтись и одним, а уже в самом методе разделять код по идентификатору кнопки. Если вы посмотрите на код в предыдущих примерах, то увидите, что в методе присутствует параметр View, который и позволяет определить, для какой кнопки предназначен кусок кода:
public void onMyButtonClick(View view) < switch(view.getId()) < case R.id.button1: // идентификатор "@+id/button1" showAlertDialog(); break; . >
Предположим, у вас есть три кнопки:
import android.view.View.OnClickListener; public class ButtonDemoActivity extends Activity implements OnClickListener. final Button button1 = (Button)findViewById(R.id.button1); final Button button2 = (Button)findViewById(R.id.button2); final Button button3 = (Button)findViewById(R.id.button3); // устанавливаем один обработчик для всех кнопок button1.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); // анализируем, какая кнопка была нажата. Всего один метод для всех кнопок @Override public void onClick(View v) < switch (v.getId()) < case R.id.button1: editText.setText("Нажата кнопка Button1"); break; case R.id.button2: editText.setText("Нажата кнопка Button2"); break; case R.id.button3: editText.setText("Нажата кнопка Button3"); break; >>
Как видите, мы сократили количество кода. Теперь у нас один обработчик onClick(), в котором прописаны действия для трёх кнопок.
Сделать кнопку недоступной
Иногда нужно сделать кнопку недоступной и активировать её при определённых условиях. Через XML нельзя сделать кнопку недоступной (нет подходящего атрибута). Это можно сделать программно через метод setEnabled():
button.setEnabled(false);
Как альтернативу можете рассмотреть атрибут android:clickable, который позволит кнопке не реагировать на касания, но при этом вид кнопки останется обычным.
Сделать кнопку плоской
Стандартная кнопка на экране выглядит выпуклой. Но в некоторых случаях желательно использовать плоский интерфейс. Раньше для этих целей можно было использовать TextView с обработкой щелчка. Но теперь рекомендуют использовать специальный стиль borderlessButtonStyle:
Кнопка сохранит своё привычное поведение, будет менять свой цвет при нажатии и т.д.
С появлением Material Design добавились другие стили, например, style=»@style/Widget.AppCompat.Button.Borderless», который является предпочтительным вариантом. Попробуйте также style=»@style/Widget.AppCompat.Button.Borderless.Colored»
Коснись меня нежно
Если вы внимательно понаблюдаете за поведением кнопки, то увидите, что код срабатывает в тот момент, когда вы отпускаете свою лапу, извините, палец с кнопки. Для обычных приложений это вполне нормально, а для игр на скорость такой подход может оказаться слишком медленным. В подобных случаях лучше обрабатывать ситуацию не с нажатием кнопки, а с его касанием. В Android есть соответствующий слушатель OnTouchListener():
Button button = (Button) findViewById(R.id.button); button.setOnTouchListener(new OnTouchListener() < @Override public boolean onTouch(View v, MotionEvent event) < if (event.getAction() == MotionEvent.ACTION_DOWN) < Toast.makeText(getApplicationContext(), "Молодой человек, не прикасайтесь ко мне!", Toast.LENGTH_SHORT).show(); >return false; > >);
У метода onTouch() есть параметр MotionEvent, позволяющий более тонко определять касания экрана. Если произойдет событие, когда пользователь коснулся экрана, то ему будет соответствовать константа ACTION_DOWN. Соответственно, если пользователь уберёт палец, то нужно использовать константу ACTION_UP. Таким образом, можете расценивать щелчок кнопки как комбинацию двух событий — касания и отпускания.
К сожалению, на сегодняшний день в Android нет метода Погладить. Коты недовольны.
Получить текст с кнопки
Навеяно вопросом с форума. Задача — получить текст кнопки в методе onClick(). У метода есть параметр типа View, у которого нет метода getText(). Для этого нужно привести тип к типу Button.
public void onClick(View view)
Если у вас несколько кнопок привязаны к методу onClick(), то щелчок покажет текст нажатой кнопки.
Дополнительное чтение
SwipeButton — кнопка с поддержкой свайпа
Вопросы с меткой [radiobutton]
Руководство по использованию метки radiobutton отсутствует.
63 вопроса
Конкурсные
Неотвеченные
- Конкурсные 0
- Неотвеченные
- Цитируемые
- Рейтинг
- Неотвеченные (мои метки)
170 показов
Как программно отключить нажатия в RadioGroup
Как отключить программно RadioGroup, чтобы находящиеся в ней RadioButton-ы не переключались. Пробовал применять к группе isEnabled=false, но это не помогает.
задан 13 мая 2020 в 16:38
148 показов
С помощью JS я хотела убрать элемент из формы при нажатии на radiobutton, но что-то пошло не так
Функция которую я использую: function signUpUserType(myRadio) < currentValue = myRadio.value; alert(currentValue); if(currentValue==1) < document.getElementById("ClassInput").
задан 3 янв 2020 в 13:02
69 показов
Изменение настроек виджета RadioButtons в matplotlib
В своём коде я строю графики. Графиков много. Для переключения между графиками я использую RadioButtons. Расположение переключателей задаю кодом: rax = plt.axes([0.905, 0.545, 0.09, 0.45], facecolor=’.
задан 10 авг 2021 в 5:29
87 показов
Как спрятать radiobutton под img в стилях JS?
Есть две радио кнопки, которые должны быть спрятаны под изображения.
Как стилизовать radio button?
Всем привет, делаю кастомные radio button и хочу реализовать две функции, но не знаю как: 1. При выборе какой-то radio-button внутри нее должен появляться кружок синего цвета и 2. Если добавляется .
задан 16 ноя 2023 в 21:18
160 показов
Использование RadioButtons в matplotlib
Разбираю пример работы RadioButtons в matplotlib. Вот простой пример: import matplotlib.pyplot as plt from matplotlib.widgets import RadioButtons x =[80, 85, 90, 95, 100, 105] s0 = [30, 22.5, 15, 7.
задан 1 авг 2021 в 10:58
1k показов
Python tkinter. Как сделать radiobutton неактивной. Программа светофор
Есть программа светофор, с радиокнопками переключения цветов и с пультом, который должен отключать эти кнопки, то есть кнопки, которые переключают цвета на светофоре, должны стать неактивными, и при .
задан 6 апр 2020 в 11:08
29 показов
CSS Radio button
Нужно сделать чтобы при нажатии на любую часть поля срабатывала кнопка, но я что-то не могу понять как
задан 29 ноя 2023 в 4:31
140 показов
Вывод нескольких блоков с по отмеченному Radio
Как вывести несколько блоков при выборе одного radio? Например сами инпуты лежат где ни будь посередине страницы, а при выборе одного из них должен появится контент вверху страницы и снизу, .
задан 16 июн 2022 в 8:13
220 показов
Проверка активности QRadioButton
Есть две QRadioButton. В зависимости от того, какая активна, при нажатии обычной кнопки, нужно вписывать в лейблы результат той или иной функции, вот только не знаю как проверять состояние радиокнопки.
задан 24 апр 2022 в 6:42
288 показов
Получение активной радиокнопки PyQT5
У меня есть группа radioButton, которые определяют куда записывать данные: в А или в Б, после нажатия на кнопку Добавить. Как мне при нажатию на pushbutton получить активную радиокнопку из группы? .
задан 22 фев 2021 в 16:27
300 показов
tkinter.Radiobutton При запуске программы показывает сразу 2 варианта выбора
Решал задачу с переключателями и вроде бы задачу решил, но при запуске высвечиваются сразу два варианта выбора (скрин ниже). Не могу понять, это можно как то исправить? Не знаю с какой стороны даже .
задан 16 янв 2021 в 20:22
Калькулятор с RADIOBUTTON. Значение radiobutton отображается alert , но к сумме не подтягивается
Пыталась прописать переменные с value, но вышла лажа т.к ещё только вникаю в синтаксис . Код кидаю песочницей еще так думаю будет лучше . https://codepen.io/EvaSpense/pen/xxZMRgr?editors=1111 .
задан 23 июл 2020 в 17:31
RadioButton не передает значения переменных
Имею проблему. В рамках класса не передается значение переменной selected, указанное в свойстве value класса Radiobutton. В ходе переключения значение в свойстве Radiobutton value было задано как .
задан 4 мар 2020 в 20:19
Как сделать, чтобы при смене радиокнопки прошлое значение убиралось и прибавлялось новое
При выборе другого radiobutton прошлый выбранный вычитывался из цены На примере кофе машины: XAML
задан 29 окт 2022 в 13:59
15 30 50 на странице
-
Важное на Мете
Связанные метки
Подписаться на ленту
Лента вопросов с наивысшим рейтингом по меткам [radiobutton]
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Урок 4. Kotlin. Обработка нажатия кнопок и взаимодействие с view в android
Продолжаем курс по разработке андроид-приложений на языке Kotlin для начинающих программистов.
На прошлом уроке мы добавили кнопки на главном экране вашего приложения, но пока эти кнопки ничего не делают. В этом уроке сделаем так, чтобы кнопки реагировали, когда пользователь нажимает их.
Автоматический импорт
Перед добавлением поведения к кнопкам необходимо включить автоматический импорт, чтобы Android Studio автоматически импортировала все классы, необходимые для кода Котлин.
- В Android Studio откройте Редактор настроек. Перейдите к File >Other Settings >Default Settings.

- Выберите Auto Imports. В разделе Java убедитесь, что пункт Add Unambiguous Imports on the fly отмечен флажком.

- Закройте редактор настроек.
Отображение сообщения по нажатию кнопки

На этом шаге мы добавим функцию отображения тоста – короткого сообщения на экране. Функция будет выполняться при нажатии кнопки с надписью TOAST.
- Откройте класс MainActivity.kt. (раскройте ветвь app >java >com.example.android.myfirstapp чтобы найти MainActivity). Этот класс описывает поведение главного экрана нашего приложения.Пока что класс содержит только одну функцию, onCreate(). Функция onCreate() выполняется, когда активити стартует.
- Посмотрите внимательно на функцию onCreate(). Обратите внимание на вызов функции setContentView(). Эта строка устанавливает файл ресурсов activity_main.xml в качестве разметки активити главного экрана.
setContentView(R.layout.activity_main);
- Добавим новую функцию toastMe() в класс MainActivity. Функция toastMe() принимает один аргумент – View. Это представление, получающее событие нажатия кнопки.Функция создает и отображает всплывающее уведомление. Вот ее код:
fun toastMe(view: View) < // val myToast = Toast.makeText(this, message, duration); val myToast = Toast.makeText(this, "Hello Toast!", Toast.LENGTH_SHORT) myToast.show() >
В языке Kotlin, если явно не используется никакого модификатора доступа, то по умолчанию применяется public . Далее идет слово fun, обозначающее функцию, и ее имя. В скобках передаваемый функции аргумент – его имя и тип разделены двоеточием. Далее объявляется переменная val myToast. Словом val обозначаются переменные «только для чтения», значение которых обычно задается только один раз. Обычные изменяемые переменные обозначаются в языке Kotlin словом var. Далее переменной myToast присваивается результат вызова метода makeText java-класса Toast. Метод makeText принимает контекст, сообщение и длительность отображения тоста, и возвращает тост в переменную myToast. Тост затем отображается методом show().
Функция toastMe является примером использования java-кода в kotlin-классе.
- Откройте файл макета activity_main.xml и добавьте свойство android:onClick кнопкеToast. Значением свойства установите toastMe.
android:onClick="toastMe"
- Запустите приложение и нажмите кнопку TOAST, вы должны увидеть на экране короткое сообщение с текстом “Hellо Toast!”.
Таким образом, что для того, чтобы сделать элемент экрана интерактивным вам нужно:
- Реализовать функцию, определяющую поведение экранного элемента при нажатии на него. Эта функция должна быть public, не возвращать никаких значений, и принимать View в качестве аргумента.
- Установить имя функции в качестве значения свойства onClick в экранном элементе.
Реализация счетчика по нажатию кнопки Count

Функция, отображающая тост, очень проста. Она не взаимодействует с другими элементами экрана. На следующем шаге мы будем по нажатию кнопки находить и обновлять другие view-элементы экрана. Напишем функцию для кнопки Count, которая при нажатии будет увеличивать значение текстового поля на 1.
- В файле макета экрана определим параметр id для TextView:
- Отройте класс ActivityMain.kt и объявите переменную для TextView:
private lateinit var textView: TextView
- В методе onCreate инициализируем её:
textView = findViewById(R.id.textView)
- В теле класса ActivityMain.kt, добавим функцию countMe(). Эта функция будет вызываться при нажатии кнопки Count, поэтому она должна быть public, не иметь возвращаемых значений, и получать View в качестве аргумента.
fun countMe (view: View)
- Получаем значение текстового поля TextView.
fun countMe (view: View) < // Get the value of the text view. val countString = textView.text.toString() >
- Конвертируем полученное значение в число, и увеличим его на единицу.
fun countMe (view: View) < // Get the value of the text view. val countString = textView.text.toString() // Convert value to a number and increment it var count: Int = Integer.parseInt(countString) count++ >
- Отображаем новое значение в TextView.
fun countMe (view: View) < // Get the value of the text view. val countString = textView.text.toString() // Convert value to a number and increment it var count: Int = Integer.parseInt(countString) count++ // Display the new value in the text view. textView.text = count.toString(); >
- Функция готова. Теперь нужно вызвать ее при нажатии кнопки COUNT. Для этого нужно установить имя функции в качестве значения свойстваonClick кнопки в файле макета.
Запустите приложение на устройстве.
При нажатии кнопки COUNT значение текстового поля увеличивается на единицу.
На этом урок подошел к концу. На следующем уроке мы добавим в приложение второй экран, который будет отображать информацию на основании данных с первого экрана.
Исходный урока код можно скачать по ссылке.
Вот ссылка на подробный справочник по языку Kotlin на русском языке – советуем с ним ознакомиться.
До встречи на следующем уроке. Всем добра)
Вам також може сподобатися

Уроки создания андроид-приложений на Kotlin 0 1 826
В прошлом уроке мы закончили основной функционал андроид приложения “Книжная полка”. В этом уроке

Уроки создания андроид-приложений на Kotlin 2 3 771
Продолжение урока о том, как создать мобильное приложение “Книжная полка” на языке Kotlin с

Уроки создания андроид-приложений на Kotlin 0 6 046
Создаем мобильное приложение на Kotlin с Jetpack Compose и Clean Architecture MVVM: три урока

Уроки создания андроид-приложений на Kotlin 0 15 267
На прошлом уроке мы познакомились с ViewPager2 и создали андроид-приложение, в котором можно листать

Уроки создания андроид-приложений на Kotlin 0 14 596
На прошлом уроке мы познакомились с нижней панелью навигации BottomNavigationView. В этом уроке реализуем
RadioButton и RadioGroup
Познакомимся с компонентом RadioButton, который находится в разделе Buttons. Главная особенность элемента состоит в том, что он не используется в одиночестве. Всегда должно быть два и более переключателя и только один из них может быть выбранным. Это похоже на кнопки на старых радиоприёмниках, когда нажимая на одну из кнопок, вы заставляете отключиться другую нажатую кнопку.
Компоненты RadioButton (переключатель) используются в составе контейнера RadioGroup. Обратите внимание на два момента. Первое — в контейнер RadioGroup можно включать не только RadioButton, но и другие элементы, например, TextView. Второе — переключатели работают в своём контейнере, т.е. если у вас два контейнера RadioGroup, то переключатели из одного контейнера не влияют на поведение переключателей второго контейнера.
Методы
Основным методом для переключателя является toggle(), который инвертирует состояние переключателя. Также представляют интерес методы isChecked(), который возвращает состояние кнопки, и setChecked(), изменяющий состояние кнопки в зависимости от параметра.
radioButton.setChecked(true); // программно устанавливаем статус у переключателя radioButton
Для уведомления о переходе положения переключателя в активное или неактивное состояние в результате определённых событий, нужно вызывать метод setOnCheckedChangeListener() с применением слушателя OnCheckedChangeListener.
Программное добавление переключателя
Получив ссылку на группу переключателей, можно добавить в неё ещё один переключатель (или другой элемент управления) через метод addView():
RadioGroup radioGroup = findViewByld(R.id.radioGroup); RadioButton newRadioButton = new RadioButton(this); newRadioButton.setText("Рыжий"); radioGroup.addView(newRadioButton);
Добавление картинок к переключателю
Вы можете добавить изображение в левой, правой, верхней и нижней части переключателя, используя либо определённые атрибуты XML или программно.
Через атрибут drawableRight и ему подобных:
Программно через метод setCompoundDrawables(left, top, right, bottom):
radioButton.setCompoundDrawables(null, null, getResources().getDrawable(R.drawable.rightpic), null);
В этом примере мы указали только одно значение для правого края, остальным присвоили значение null. Можно одновременно задействовать все стороны переключателя.
Пример с переключателями
Создадим новую форму с четырьмя кнопками-переключателями, с помощью которых будем заливать фон приложения выбранным цветом. Сначала подготовим строковые ресурсы.
Пример с переключателями (RadioButton) Текущий выбор Красный Зеленый Синий Серый
Создадим простейшую разметку на основе LinearLayout. Заполним форму текстовым блоком определённого цвета и присвоим ему текст «Текущий цвет». В нижней части формы расположим четыре цветных текстовых блока, а под ними четыре переключателя, с помощью которых мы будем менять цвет основного текстового блока.
Обратите внимание, что элементы RadioButton помещаются в контейнер RadioGroup. Если теперь посмотреть на форму, то увидим одно большое серое поле. А снизу расположились в ряд четыре метки, а ещё ниже также в ряд расположились четыре переключателя. Причём последний серый переключатель имеет выбранный статус (android:checked=»true»).
Переходим к программной части. Добавляем слушатель для обработки щелчков на кнопках-переключателях.
package ru.alexanderklimov.radio; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.RadioButton; import android.widget.TextView; public class MainActivity extends AppCompatActivity < private TextView mInfoTextView; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mInfoTextView = findViewById(R.id.current_pick); RadioButton redRadioButton = findViewById(R.id.radio_red); redRadioButton.setOnClickListener(radioButtonClickListener); RadioButton greenRadioButton = (RadioButton)findViewById(R.id.radio_green); greenRadioButton.setOnClickListener(radioButtonClickListener); RadioButton blueRadioButton = findViewById(R.id.radio_blue); blueRadioButton.setOnClickListener(radioButtonClickListener); RadioButton grayRadioButton = findViewById(R.id.radio_gray); grayRadioButton.setOnClickListener(radioButtonClickListener); >View.OnClickListener radioButtonClickListener = new View.OnClickListener() < @Override public void onClick(View v) < RadioButton rb = (RadioButton)v; switch (rb.getId()) < case R.id.radio_red: mInfoTextView.setBackgroundColor(Color.parseColor("#ff0000")); break; case R.id.radio_green: mInfoTextView.setBackgroundColor(Color.parseColor("#0000ff")); break; case R.id.radio_blue: mInfoTextView.setBackgroundColor(Color.parseColor("#00ff00")); break; case R.id.radio_gray: mInfoTextView.setBackgroundColor(Color.parseColor("#666666")); break; default: break; >> >; >
Запустим приложение и посмотрим, что у нас получилось. Пощёлкаем по переключателям и убеждаемся, что всё работает.

Слушатель OnCheckedChangeListener
Показанный выше способ использует щелчок, так как переключатели можно рассматривать как кнопки. Но на самом деле у переключателей есть свой слушатель OnCheckedChangeListener. Я расположил в новом проекте RadioGroup с тремя RadioButton и написал простенький пример.
// Kotlin // Если этот код работает, его написал Александр Климов, // а если нет, то не знаю, кто его писал. package ru.alexanderklimov.radio import android.os.Bundle import android.widget.RadioButton import android.widget.RadioGroup import android.widget.TextView import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById(R.id.textView) val radioGroup = findViewById(R.id.radioGroup) // radio group checked change listener radioGroup.setOnCheckedChangeListener < _, checkedId ->// get the radio group checked radio button findViewById(checkedId)?.apply < // show the checked radio button's text in text view textView.text = text >> > >
// Java @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RadioGroup radioGroup = findViewById(R.id.radioGroup); radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() < @Override public void onCheckedChanged(RadioGroup group, int checkedId) < switch (checkedId) < case -1: Toast.makeText(getApplicationContext(), "Ничего не выбрано", Toast.LENGTH_SHORT).show(); break; case R.id.radioButtonOne: Toast.makeText(getApplicationContext(), "Первый переключатель", Toast.LENGTH_SHORT).show(); break; case R.id.radioButtonTwo: Toast.makeText(getApplicationContext(), "Второй переключатель", Toast.LENGTH_SHORT).show(); break; case R.id.radioButtonThird: Toast.makeText(getApplicationContext(), "Третий переключатель", Toast.LENGTH_SHORT).show(); break; default: break; >> >); >
Этот способ намного удобней. Вам даже не нужно объявлять ссылки на переключатели и назначать им слушатели. Код получается более компактным.
Обратите внимание, что метод onCheckedChanged() принимает параметр RadioGroup, что позволяет применять один и тот же слушатель OnCheckedChangeListener() для нескольких групп переключателей. Вариант -1 сработает, когда группа переключателей будет сброшена в коде с помощью метода clearCheck().
Метод clearCheck()
Когда пользователь выберет любой из переключателей, то он уже не сможет снять с него отметку. Какой-нибудь из переключателей обязательно будет выбран в одном контейнере с ним. Единственный способ очистить все переключатели — программно вызвать метод clearCheck(), который относится к классу RadioGroup.
RadioGroup radioGroup; // щелчок кнопки public void onClick(View view) < // очистить все переключатели radioGroup.clearCheck(); >
Метод getCheckedRadioButtonId(): Узнать выбранный элемент
У RadioGroup есть также метод getCheckedRadioButtonId(), который позволяет узнать идентификатор выбранного переключателя. Можем узнать выбранный переключатель через нажатие кнопки.
// Kotlin // Если этот код работает, его написал Александр Климов, // а если нет, то не знаю, кто его писал. package ru.alexanderklimov.radio import android.os.Bundle import android.widget.Button import android.widget.RadioButton import android.widget.RadioGroup import android.widget.TextView import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById(R.id.textView) val button = findViewById(R.id.button) val radioGroup = findViewById(R.id.radioGroup) button.setOnClickListener < val checkedRadioButtonId = radioGroup.checkedRadioButtonId when(checkedRadioButtonId)< -1 -> < textView.text = "Ничего не выбрано" >else -> < // Найдём переключатель по его id val selectedRadioButton = findViewById(checkedRadioButtonId) textView.text = selectedRadioButton.text > > > > >
// Java public void onClick(View view) < int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId(); // Найдём переключатель по его id RadioButton myRadioButton = findViewById(checkedRadioButtonId); Toast.makeText(getApplicationContext(), myRadioButton.getText(), Toast.LENGTH_SHORT).show(); >
Также можно узнать индекс выбранного переключателя через метод indexOfChild():
OnCheckedChangeListener radioGroupOnCheckedChangeListener = new OnCheckedChangeListener()< @Override public void onCheckedChanged(RadioGroup group, int checkedId) < RadioButton checkedRadioButton = (RadioButton)radioGroup.findViewById(checkedId); int checkedIndex = radioGroup.indexOfChild(checkedRadioButton); textCheckedIndex.setText("checkedIndex text-warning" >Кот или муж? Теперь, когда вы познакомились с новым элементом, то вам не составит труда написать программу для нелёгкого выбора.
Разметка:
// Если этот код работает, его написал Александр Климов, // а если нет, то не знаю, кто его писал. package ru.alexanderklimov.radiobutton; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.RadioGroup; import android.widget.TextView; public class MainActivity extends AppCompatActivity < private TextView mInfoTextView; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mInfoTextView = findViewById(R.id.textView); RadioGroup radioGroup = findViewById(R.id.radioGroup); radioGroup.clearCheck(); radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() < @Override public void onCheckedChanged(RadioGroup group, int checkedId) < switch (checkedId) < case -1: mInfoTextView.setText(""); break; case R.id.radioButtonHusband: mInfoTextView.setText("Подумайте ещё раз"); break; case R.id.radioButtonKitten: mInfoTextView.setText("Отличный выбор!"); break; >> >); > >

Девушки, нужен ли вам такой муж? Если он не любит котиков, то будет ли любить вас? Возьмите лучше котёнка. Он клёвый.
Собственные стили
Если вы используете стандартный проект, то переключатели будут использовать цвета Material Design, в частности цвет colorAccent для кружочка с точкой.
В файле res/values/styles.xml добавим строки:
Свойство colorControlNormal отвечает за окружность в невыбранном состоянии, а colorControlActivated за точку и окружность в выбранном состоянии.
Присваиваем созданный стиль атрибуту android:theme:
Теперь цвета флажков изменились.

Собственный вид
Если вас не устраивает стандартный вид элементов RadioButton, то не составит никакого труда реализовать свои представления о дизайне.
В папке res/drawable создаём файл radiobutton_selector.xml:
Также необходимо подготовить два изображения для двух состояний - выбран и не выбран.
Осталось прописать селектор в элементе RadioButton при размещении на экране (атрибут android:button):
Готово! Можете запускать проект и проверять работу переключателей.

Дополнительное чтение
Библиотеки
Пример на Kotlin есть в здесь