Skip to content
Bugwise
Menu
UI Components

Radio Button

A group of round options where exactly one can be chosen, like Standard or Express delivery. Learn when to use it instead of a dropdown, checkbox or segmented control, when to preselect, how the keyboard should work, and the grouping bugs testers find.

30 min Inputs & selection iOS · Android · Web Also called: Radio, Option button, Radio group

Standard or Express delivery? Card or PayPal? Window or aisle? Whenever an app asks you to pick exactly one answer from a short list, you’re probably looking at radio buttons. The name comes from old car radios, where pushing in one station button popped the others out.

That “only one” promise is the whole point, and it’s exactly what breaks: two payment methods selected at once, a total that ignores your choice, an order placed with nothing selected. Let’s learn how to catch it.

What is a radio button?

A radio button is a round option inside a group, where exactly one option can be selected. Selecting one automatically unselects the others: the options are mutually exclusiveMutually exclusiveOptions where choosing one automatically means the others can't be chosen.Open in glossary →. A single radio button on its own makes no sense. It always lives in a group with a question (“Delivery”, “Payment method”).

You’ll see radio groups used for:

  • Delivery and shipping options: Standard / Express / Next day, each with a date and a price.
  • Payment methods: Card / PayPal / Pay on delivery.
  • Plans and sizes: Monthly / Yearly, Small / Medium / Large.
  • Survey and preference questions: Seat preference, “How did you hear about us?”.

Anatomy

  1. 1

    Group label (question)

    Says what you are choosing. On the web it is the <legend> of a <fieldset>. Without it, "Standard" and "Express" mean nothing to a screen reader user.

  2. 2

    Selected indicator

    An outer ring with a filled inner dot. Only one option in the group can have it.

  3. 3

    Unselected circle

    An empty ring. Round, never square: the shape tells users "pick one".

  4. 4

    Label

    The option itself. Tapping it must select the option too.

  5. 5

    Supporting text (optional)

    Details that help the user decide: delivery dates, a price, a fee.

  6. 6

    Touch target

    The tappable area: ideally the whole row, at least 44×44 pt (iOS) or 48×48 dp (Android).

Two rules that define a radio group

  1. Exactly one can be selected. Selecting a second option unselects the first.
  2. Once something is selected, you can’t go back to “nothing”. Tapping a selected radio again does nothing. If “no answer” is valid, the group needs an option for it, like None or Prefer not to say.

Both rules are worth a test case of their own.

Radio vs dropdown vs segmented control vs checkbox

ComponentChoicesVisible?Best for
Radio buttonsExactly one of ~2–6All at onceForms, options that need a description or price
DropdownOne of manyHidden until openedLong lists: country, size chart, time slot
Segmented controlOne of 2–5 short labelsAll at onceSwitching views or filters immediately
CheckboxZero, one or manyAll at oncePicking several items, or one yes/no
Dev note

The web calls it a radio button (<input type="radio">). Material Design calls it a radio button too. Apple’s iOS guidelines don’t have one at all: iPhone apps use checkmark lists, pickers or menus for single choice. Some teams say option button. In bug reports, use the name your team uses.

Designs & variants

Every group here works. Click the labels, and try Tab + arrow keys.

Sort restaurants by

Material 3 radio button

Android

A 20 dp circle inside a 48 dp touch target. The whole row is usually tappable, and a round highlight shows hover, press and focus.

Auto-Lock

iOS: checkmark list

iOS

iOS has no radio button control. Single choice is a list with a checkmark on the selected row, like Settings › Display & Brightness › Auto-Lock, or a menu.

Billing

Native web radios

Web

<input type="radio"> elements that share one name, inside a <fieldset> with a <legend>. Grouping, arrow keys and screen reader support come for free.

Delivery

Radio cards with details

Web · Apps

Each option is a card with a description and a price. The whole card is the label, so tapping the text selects it. One option is disabled, with the reason shown.

Payment method

Choose a payment method to continue.

Required group with an error

All

No option is preselected, so the user must choose. If they skip it, the error text names the problem and is linked to the group.

  • Unselected
  • Selected
  • Focused
  • Disabled
  • Disabled on
  • Error

All the states

All

Disabled radios keep showing whether they are selected. A focused radio needs a visible ring for keyboard users.

Keyboard: one tab stop, arrows inside

Radio groups work differently from every other form control on the keyboard. Try it: click into “Passenger name”, then use Tab, the arrow keys and Space, and watch the log.

Seat preference

Key log

  • Click "Passenger name", then press Tab…
  • Tab enters the group once, on the selected radio (or the first one if nothing is selected).
  • Arrow keys move focus and selection inside the group, and wrap around.
  • Tab again leaves the group and goes to Continue.
  • Space selects the focused radio if none is selected yet.

This is what native radio buttons do for free. Custom-built radio groups (made of divs or styled buttons) often get it wrong: every option becomes its own tab stop, or the arrow keys do nothing. Both are bugs. See keyboard navigationKeyboard navigationUsing a website with only the keyboard: Tab to move, Enter or Space to activate, Esc to close.Open in glossary →.

When to use it

Radio buttons are the right choice when:

  • The user must pick exactly one option.
  • There are few options (roughly 2–6), so they can all be shown at once.
  • Seeing the options side by side helps the decision: prices, delivery dates, plan details.
  • The choice is part of a form and applies when the user presses Continue, Pay or Save.

Should one option be preselected?

Many design guidelines recommend selecting a sensible default, because it saves a tap and the user can’t accidentally skip the question. But a default is a decision made for the user, so it has to be a safe one.

Preselect when…Don’t preselect when…
There’s a safe, common choice: Standard (free) deliveryThe default costs money: insurance, a paid upgrade
The setting already has a value: the user’s saved cardThe question is personal or sensitive: title, gender, date of birth
A wrong default is easy to notice and cheap to changeYou need to know the user really chose (consent, legal answers)

If there’s no default, the form must block submission until the user chooses, with a clear error. Whatever the rule, it should be written in the spec, so you can test against it.

Good and bad uses

Safe default preselected

Delivery

StandardArrives Tue–ThuFree
ExpressArrives tomorrow€6.99

Free Standard delivery is what most people want. Express is one tap away.

Paid extra preselected

Travel insurance

Yes, protect my trip€24.00
No, I'll take the risk

Users who don’t read carefully pay €24 they never chose. Leave it unselected and make the user decide.

A few options, all visible

Size

Small250 ml
Medium350 ml
Large450 ml

Three options with short details. Users compare them at a glance.

A long list as radios

Country

Austria
Belgium
Croatia
Denmark
Estonia
Finland
France
Germany
Greece
Ireland
… 17 more

27 countries as radio buttons fill the screen. Use a dropdown or a searchable list.

Single yes/no as a checkbox

Email me my receipt

Tap again to untick it.

A checkbox can be ticked and unticked.

A lone radio button

Email me my receipt

Selected… and now there is no way to unselect it.

Once it’s selected, it can never be unselected. A lone radio is always a bug.

Also skip radio buttons when the choice should switch content immediately on the same screen, like List / Map. That’s a segmented control.

Common bugs

#BugWhat you seeTypical severity
1Broken groupingTwo options in the same group can be selected at once (often a mismatched name on the web)High
2Wrong keyboard behaviorArrow keys don’t move the selection, or every option is a separate tab stopHigh (for affected users)
3Dependent values not updatedSwitching Express → Standard doesn’t change the total, delivery date or feeHigh
4Nothing selected, still submitsNo default, and the form goes through with no choice (or sends null)High
5Tiny targetOnly the circle reacts; tapping the label, description or price does nothingMedium
6Selection lostAfter a validation error, Back, rotation or reload the choice jumps back to the defaultMedium
7Bad defaultA paid or sensitive option is preselected, or the default doesn’t match the specMedium–High
8Disabled option without reasonAn option is greyed out, but nothing says why (“Not available for your address”)Low–Medium
9Disabled option still selectableA greyed-out option can be picked by keyboard or by tapping its labelMedium
10Screen reader silenceNo group name, no “radio button”, no “selected”, no “2 of 3”High (for affected users)

Find the bug

This web checkout has six bugs in its two radio groups. Explore it like a tester:

  • Switch between all three shipping options and read the total every time.
  • Tap the shipping names, descriptions and prices, not just the circles.
  • Use only the keyboard: Tab into each group and try the arrow keys.
  • Try to pick two payment methods.
  • Press Place order with the email empty, and again without choosing a payment method.

🐞 Bug hunt: Checkout

This demo has 6 hidden bugs. Explore it like a tester, then check your findings.

Found0/6
shop.example.com/checkout
StrideCheckout

Shipping

Standard3–5 working daysFree
Express1–2 working days€6.99
Next dayOrder by 8 pm, arrives tomorrow€12.99
Payment
Trail running shoes
€54.00
Shipping (Standard)
Free
Total
€54.00

Use the mouse and the keyboard (Tab, arrows, Space).

  1. 1

    Hint: Select Card, then Pay on delivery.

  2. 2

    Hint: Tab to a shipping option and press the Down arrow.

  3. 3

    Hint: Select Express and compare the Shipping line with the Total. Then select Next day.

  4. 4

    Hint: Enter an email, don’t choose any payment method, and press Place order.

  5. 5

    Hint: Click the words "Next day" or the price "€12.99".

  6. 6

    Hint: Select Next day, leave the email empty and press Place order.

How to test it

Checklist

Radio button test checklist

0 of 12 checked

Example test cases

TC-RB-001Only one shipping option can be selected

Steps

  1. Open Checkout
  2. Select Express
  3. Select Next day
  4. Select Standard

Expected result

After each step exactly one option is selected: the last one tapped.

TC-RB-002Total updates for every shipping option

Preconditions

  • Cart subtotal is €54.00

Steps

  1. Select Express
  2. Select Next day
  3. Select Standard

Expected result

Total reads €60.99, then €66.99, then €54.00. The shipping line and the total always agree.

TC-RB-003Order cannot be placed without a payment method

Preconditions

  • No payment method is preselected

Steps

  1. Fill in a valid email
  2. Leave Payment empty
  3. Press Place order

Expected result

An error "Choose a payment method" is shown next to the Payment group and announced. No order is created.

TC-RB-004Payment options form one group

Steps

  1. Select Card
  2. Select Pay on delivery
  3. Select PayPal

Expected result

Each new selection unselects the previous one. Only PayPal is selected at the end.

TC-RB-005Choice is kept after a validation error

Steps

  1. Select Next day
  2. Leave the email empty
  3. Press Place order

Expected result

The email error is shown. Next day is still selected and the total still includes €12.99.

TC-RB-006Keyboard navigation inside the group

Preconditions

  • Web, desktop browser
  • Standard is selected

Steps

  1. Press Tab until the Shipping group is focused
  2. Press the Down arrow twice
  3. Press Tab

Expected result

Focus enters on Standard. Down selects Express, then Next day. Tab leaves the group and moves to Payment.

TC-RB-007Whole option card is clickable

Steps

  1. Click the description text of Express
  2. Click the price of Next day

Expected result

Express is selected after the first click, Next day after the second.

Tip: click a test case to expand it.

Accessibility

Mobile vs web

  • No native radio button. Single choice is shown as a list with a checkmark on the selected row (Settings › Display & Brightness › Auto-Lock), a picker (inline, menu or wheel style), or a menu.
    Dev note
    The picker is a SwiftUI Picker.
  • VoiceOver should announce the selected row as “Selected”. Silence is a bug.
  • Some apps draw custom radio circles. Check the whole row is tappable and that VoiceOver reads the state.
  • Test with the largest Dynamic Type sizes: option descriptions with prices must wrap, not truncate.
  • Material 3 radio button: a 20 dp circle inside a 48 dp touch target. The whole row should be tappable, and TalkBack should understand the group.
    Dev note
    RadioButton. In Compose, rows should use Modifier.selectable(role = Role.RadioButton) and the group Modifier.selectableGroup().
  • TalkBack should announce the label, “radio button” and whether it’s selected. Test with font scale, display size and dark theme.
  • Check the selection after rotation and after the app was killed in the background.
  • Android dialogs often use radio lists (“Choose ringtone”) with OK / Cancel. Cancel must discard the change.
  • Native <input type="radio"> gives grouping, keyboard and screen reader support. Inspect the name attributes with DevToolsDevToolsDeveloper tools built into browsers for inspecting pages, network traffic and errors.Open in glossary →: all options of one question must share it.
  • Custom radio cards are very common. Check they behave like native radios with the keyboard.
  • The browser doesn’t stop a form from submitting with nothing selected unless required is set, and the server must validate too.
  • Test browser Back and reload: some browsers restore form state, others don’t. Check what the spec expects.

Check your understanding

Quick quiz

0/5 answered · 0 correct

  1. 1.A checkout lets you choose Standard, Express or Next day delivery, each with a date and price. Which control fits best?

  2. 2.On a web form you can select both "Card" and "Pay on delivery". What is the most likely cause?

  3. 3.What should the arrow keys do inside a radio group on the web?

  4. 4.Which option should NOT be preselected?

  5. 5.You switch from Express to Standard, the shipping line says "Free", but the total still includes €6.99. What kind of bug is this?

Key takeaways

  • Radio buttons are for exactly one choice from a small, visible set. Many options → dropdown. Several choices → checkboxes. Instant view switch → segmented control.
  • Once selected, a group can’t go back to “nothing”. A lone radio is always wrong.
  • Preselect only a safe, free, common default. No default → the form must require a choice, on the server too.
  • Test grouping (only one selected), everything calculated from the choice (totals, dates), the whole row as a target, and state after errors and Back.
  • On the web: one tab stop per group, arrow keys inside, a legend for the question, and a shared name for all options.

Finished this page?Nice work, this page is complete!

Mark it as done to track your progress. It's saved in this browser, no account needed.

Its review cards are now in Bites ⚡
Esc

Type to search the whole site.