Common Small Touch Targets in Survey Apps: Causes and Fixes
Survey applications are built around a series of interactive elements: multiple‑choice radio groups, Likert scales, checkbox lists, slider controls, and progress buttons. Many developers size these el
What causes small touch targets in survey apps (technical root causes)
Survey applications are built around a series of interactive elements: multiple‑choice radio groups, Likert scales, checkbox lists, slider controls, and progress buttons. Many developers size these elements based on design mock‑ups that use abstract density units (dp, sp) without converting them to actual screen pixels for the target device population. Common root causes include:
- Mis‑scaled UI kits – A component library defines a 48 dp touch target, but the build script multiplies by a device‑specific density factor only for images, not for touch‑hit boxes.
- Nested layouts – Constraint layouts or relative positioning can shrink a button when sibling views request extra space, especially in responsive screens that re‑wrap elements on narrow orientations.
- Dynamic content insertion – Conditional UI (e.g., “show optional question if previous answer is X”) may be added via fragments or view groups that do not preserve minimum size constraints.
- Font‑size‑driven scaling – Text‑only buttons that rely on
wrap_contentwidth can become smaller than 44 × 44 dp when using small system fonts or custom typography for accessibility. - Improper
minWidth/minHeightattributes – Android’sandroid:minWidthandandroid:minHeightare often omitted, relying onlayout_width="wrap_content". - Design‑system drift – Over time, visual designers update mock‑ups without adjusting the underlying dimension constants, leading to regression in released builds.
- Cross‑platform inconsistencies – React Native, Flutter, or Xamarin components may map a logical pixel to physical pixels differently, causing the same dp value to resolve to different physical sizes on Android vs iOS.
These technical oversights converge on a single symptom: interactive areas that are smaller than the recommended 48 dp (≈ 44 px on most devices) for reliable tapping.
Real‑world impact (user complaints, store ratings, revenue loss)
When touch targets fall below the usability threshold, survey apps experience measurable degradation in key performance indicators:
- Support tickets spike – Users report “buttons won’t click” or “checkboxes keep bouncing.” Typical support volume can rise 30‑50 % within weeks of a release.
- Negative store ratings – A single‑star reviews often cite “hard to select answers.” A 0.2‑point drop in average rating can translate to a 15 % reduction in new installs for apps relying on organic growth.
- Survey abandonment – Heat‑map data from production shows a 22 % increase in drop‑off at the first interactive element after a UI redesign.
- Revenue leakage – Paid survey platforms lose $2‑5 k per month per million installs when users exit before completing paid questionnaires.
- Accessibility violations – WCAG 2.1 AA checklists flag “target size” failures, triggering compliance warnings from app stores and potential removal from certain marketplaces.
- Brand reputation – Repeated “tappable” complaints erode trust, especially among the elderly and novice persona groups that rely heavily on clear, large interaction points.
The financial impact is amplified because survey apps often compete on user‑experience quality; a single friction point can cascade through the entire participant journey.
5‑7 specific examples of how small touch targets manifests in survey apps
| # | Example | Typical Manifestation |
|---|---|---|
| 1 | Likert scale buttons | Each rating icon (e.g., “Strongly Disagree”) rendered as a 32 dp ImageView, missing android:minimumWidth and android:minimumHeight. |
| 2 | Checkbox list items | CheckBox inside a LinearLayout with layout_width="wrap_content"; text label consumes space, leaving the actual box at 28 dp. |
| 3 | Next/Previous navigation | Button styled with custom background and android:layout_width="0dp" (weight‑based) but weight sum > 1, causing the button to shrink to < 40 dp. |
| 4 | Slider thumb area | SeekBar with a custom theme that sets android:thumbSize="20dp" and android:trackHeight="4dp"; touch hit area collapses to the thumb diameter. |
| 5 | Conditional “Show More” expansion | TextView used as a toggle with layout_width="wrap_content" and a small underline drawable; tap zone limited to text width. |
| 6 | Mobile‑first numeric input | EditText with inputType="number" and android:layout_width="30dp"; users cannot reliably tap the up/down spinners. |
| 7 | Submit survey button | Floating action button (FAB) with android:backgroundTint applied but android:minWidth="0dp" and android:layout_width="wrap_content"; final tap target ends up at 36 dp. |
Each scenario can be reproduced by a simple script that measures the touch‑hit rectangle of the view in the running app.
How to detect small touch targets (tools, techniques, what to look for)
- Automated UI inspection with SUSATest
- Upload the APK or a live URL; SUSA explores the app autonomously and records the bounding box of every clickable view.
- The platform’s coverage analytics surface a “small‑target” report, listing elements whose width < 44 px (Android) or height < 44 px.
- Persona‑based testing (curious, elderly, novice) highlights failures that are more likely to be reported by those groups.
- Static analysis
- Use Android Studio’s Lint rule
HardcodedTextandMissingMinWidth/MissingMinHeightto flag missing minimum dimensions. - Add a custom Lint check that validates
dpvalues against a project‑wide threshold (e.g.,MIN_TOUCH_TARGET_DP = 48).
- Dynamic instrumentation
- Instrument the app with a simple
Viewsubclass that logs itsonTouchEventbounds. - Combine with Appium or Playwright scripts (auto‑generated by SUSA) that attempt to tap each element and record success/failure rates.
- Third‑party tools
- Accessibility Scanner (Android) reports “Touch target too small.”
- Chromium DevTools for progressive web apps can show element dimensions in the Elements panel.
- Detox or XCUITest can assert minimum tap area by checking
framesize.
- Visual regression
- Tools like BackstopJS can capture screenshots of each interactive element and compare against a baseline that includes a visual overlay of the touch hit zone.
When any of these methods surface a target smaller than the recommended 44‑48 dp, the issue should be logged as a small‑touch‑target defect in the SUSA defect tracker, linked to the specific user persona that triggered it.
How to fix each example (code-level guidance where applicable)
1. Likert scale buttons
- Add
android:layout_width="48dp"andandroid:layout_height="48dp"to theImageVieworButton. - Set
android:background="?attr/colorControlHighlight"or aRippleDrawableto maintain visual feedback. - Ensure
android:focusable="true"andandroid:clickable="true"for keyboard navigation.
2. Checkbox list items
- Wrap the
CheckBoxin aConstraintLayoutwithapp:layout_constraintWidth_min="48dp"andapp:layout_constraintHeight_min="48dp". - Use
android:paddingStart="12dp"andandroid:paddingEnd="12dp"to expand hit area without enlarging the visual box. - Alternatively, apply a
android:touchDelegatethat expands the parent view’s touch region.
3. Next/Previous navigation
- Define a fixed minimum size:
android:minWidth="48dp"andandroid:minHeight="48dp". - Use
layout_weightbut set a minimum width for each button:android:layout_width="0dp"withandroid:layout_weight="1"andapp:layout_constraintWidth_min="48dp"in ConstraintLayout. - For
LinearLayout, setandroid:layout_width="wrap_content"and addandroid:layout_margin="8dp"to ensure spacing.
4. Slider thumb area
- Modify the custom theme:
android:thumbSize="48dp"andandroid:trackHeight="8dp". - Add
android:touchDelegatereferencing a largerViewthat surrounds theSeekBar. - For
MaterialSlider, setsetThumbRadius(24dp)andsetTrackHeight(8dp)in code.
5. Conditional “Show More” expansion
- Replace the
TextViewtoggle with aButtonorImageButtonthat has explicit dimensions:android:layout_width="80dp"andandroid:layout_height="48dp". - Use
android:padding="12dp"to enlarge the tap zone. - Alternatively, wrap the text in a
FrameLayoutwithandroid:clickable="true"andandroid:focusable="true"and setandroid:layout_width="wrap_content"withandroid:layout_height="48dp".
6. Mobile‑first numeric input
- Increase the
EditTextwidth:android:layout_width="120dp"(ormatch_parentwith padding). - Ensure the up/down buttons are reachable by setting `android:padding="
Test Your App Autonomously
Upload your APK or URL. SUSA explores like 10 real users — finds bugs, accessibility violations, and security issues. No scripts.
Try SUSA Free