Common Text Truncation in Salon Booking Apps: Causes and Fixes

All of these stem from layout assumptions that treat text as static. In a salon‑booking app the content changes daily – new promotions, staff swaps, holiday hours – making static sizing a recipe for t

February 15, 2026 · 6 min read · Common Issues

1. What causes text truncation in salon‑booking apps

Root causeWhy it appears in a salon‑booking UI
Hard‑coded width / max‑length constraintsDesigners often lock a button or label to a fixed pixel width (e.g., width: 120dp). When a service name (“Deep Tissue Swedish Massage – 90 min”) exceeds that width, Android or the browser clips the string and adds an ellipsis.
Dynamic content without locale‑aware sizingSalon apps pull service titles, staff names, and promotions from a CMS. Some languages (German, Russian) expand the same string dramatically, breaking a layout that was only tested with English text.
Improper use of singleLine / maxLines=1In Android XML, android:singleLine="true" forces a single line regardless of available space. The same pattern exists in CSS with white‑space: nowrap. The result is silent truncation.
Overflow hidden in container stylesoverflow: hidden (web) or android:clipChildren="true" (Android) discards overflow content instead of showing a scroll or ellipsis.
Missing responsive breakpointsA mobile‑first layout may look fine on a 360 dp screen but break on a tablet or a foldable where the same component is stretched, causing the text to be squeezed into a smaller box.
Inconsistent font scaling / accessibility settingsUsers who enable “Large Text” or “Display size” on Android/iOS increase the type size, but the UI does not re‑measure the container, so the text is cut off.
Incorrect measurement of dynamic stringsWhen a list is populated through a RecyclerView adapter, developers sometimes compute the item height once (using a placeholder string) and reuse it, ignoring longer real data.

All of these stem from layout assumptions that treat text as static. In a salon‑booking app the content changes daily – new promotions, staff swaps, holiday hours – making static sizing a recipe for truncation.

---

2. Real‑world impact

---

3. 5‑7 concrete examples of truncation in salon‑booking apps

  1. Service list tile – The tile shows “Haircut + Beard Trim (30 min) – $45”. On devices with a narrow screen, the “+ Beard Trim (30 min) – $45” part disappears, leaving only “Haircut…”.
  2. Staff profile card – “Maria González – Senior Stylist, Color Specialist”. The last name and title are cut, showing “Maria Gon…”.
  3. Promotion banner – “Spring Special: 20 % off all facial treatments until May 31”. The percentage sign and date are hidden, turning the banner into “Spring Special: 20 %…”.
  4. Checkout summary line – “Total (incl. taxes & fees): $123.45”. The “incl. taxes & fees” fragment is truncated, confusing users about the price composition.
  5. Search autocomplete – Typing “manic” yields “Manicure – Classic French”. The “Classic French” suffix is clipped, making the suggestion ambiguous.
  6. Appointment confirmation email (web view) – The email template renders a long “Appointment Details” paragraph; the last sentence (“Please arrive 10 minutes early”) is cut off on mobile browsers.
  7. Accessibility label for a button – The content description reads “Book now for Deep Tissue Swedish Massage – 90 min – $120”. Screen‑reader reads only “Book now for Deep Tissue…”, denying essential pricing info to users who rely on voiceover.

---

4. How to detect text truncation

Detection methodWhat to look forTools
Automated UI crawlScreens where an element’s rendered width < scrollWidth (web) or getLayout().getEllipsisCount() > 0 (Android).SUSA – upload the APK or web URL, run the *Curious* and *Accessibility* personas. SUSA flags “Ellipsis detected” and produces a screenshot with the clipped element.
Pixel‑perfect visual diffCompare baseline screenshots (golden master) with new builds; any shift in text baseline or missing characters indicates truncation.Applitools Eyes, Percy, or SUSA’s built‑in regression diff (Appium + Playwright scripts).
Accessibility auditWCAG 2.1 AA requires that text not be clipped when zoomed to 200 %. Run a screen‑magnifier test.Axe‑core (web), Android Accessibility Test Framework, SUSA’s *Accessibility* persona (dynamic zoom).
Log‑based layout validationCapture layout hierarchy (UIAutomator dump, Chrome DevTools protocol) and assert maxLines vs. actual line count.Custom JUnit test, SUSA auto‑generated script that asserts !element.isEllipsized().
Manual exploratory sessionSwitch device font size to “Large” (Android Settings → Display → Font size) and repeat typical flows.Physical device or Android Emulator; SUSA can simulate this via CLI (susatest-agent --font-scale 1.3).
Network‑driven data fuzzingInject long strings (e.g., 200‑character service names) via mock API and observe UI.Postman mock server + SUSA *Adversarial* persona.

When a test fails, SUSA provides a JUnit‑compatible XML report with the element’s resource‑id, the measured vs. required width, and a screenshot highlighting the ellipsis.

---

5. How to fix each example (code‑level guidance)

1. Service list tile

*Problem*: Fixed width: 120dp in list_item_service.xml.

Fix


<!-- Use wrap_content and weight to let the text grow -->
<TextView
    android:id="@+id/tvServiceName"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_height="wrap_content"
    android:maxLines="2"
    android:ellipsize="end"
    android:textAppearance="?attr/textAppearanceBody1"/>

*Add* android:ellipsize="end" and maxLines="2" to allow a second line before truncation.

2. Staff profile card

*Problem*: android:singleLine="true" on the name view.

Fix


<TextView
    android:id="@+id/tvStaffName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:focusable="true"
    android:focusableInTouchMode="true"/>

Switch to maxLines="1" with marquee only if scrolling is desired; otherwise allow maxLines="2".

3. Promotion banner

*Problem*: Container uses overflow: hidden in CSS.

Fix


.promo-banner {
  display: flex;
  align-items: center;
  padding: 0.5rem 1rem;
  white-space: normal; /* allow wrap */
  overflow: visible;   /* let text spill */
}

If the design requires a single line, apply text-overflow: ellipsis; and increase the container’s min-width to accommodate the longest known promotion.

4. Checkout summary line

*Problem*: TextView set to android:lines="1" and a small textSize.

Fix


val summary = findViewById<TextView>(R.id.tvSummary)
summary.apply {
    setAutoSizeTextTypeUniformWithConfiguration(
        12, 18, 1, TypedValue.COMPLEX_UNIT_SP) // auto‑size between 12‑18sp
    maxLines = 2
}

Auto‑size ensures the text shrinks only to a readable limit before wrapping.

5. Search autocomplete

*Problem*: Autocomplete dropdown uses a fixed max-width: 150px.

Fix


.autocomplete-item {
  max-width: none;          /* remove hard cap */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;  /* show ellipsis only when truly overflowed */
}

Alternatively, compute width based on viewport: max-width: 90vw;.

6. Appointment confirmation email (web view)

*Problem*:

element has height: 2rem and overflow: hidden.

Fix


<p style="max-height:none; overflow:auto; line-height:1.5;">
  {{appointmentDetails}}
</p>

Allow the container to grow; use line-height for readability.

7. Accessibility label for a button

*Problem*: Content description generated from a truncated TextView.

Fix


val btnBook = findViewById<Button>(R.id.btnBook)
val fullLabel = "Book now for ${service.title} – ${service.duration} – $${service.price}"
btnBook.contentDescription = fullLabel

Never derive contentDescription from the UI element; build it from the data model.

---

6. Prevention – catching truncation before release

  1. Integrate SUSA into CI/CD
  1. Define a “text‑fit” lint rule
  1. Locale‑aware UI tests
  1. Responsive design token checks
  1. Automated visual regression baseline
  1. Accessibility audit checkpoint
  1. Cross‑session learning

By embedding these safeguards—automated detection, linting, responsive testing, and SUSA’s autonomous exploration—teams eliminate text truncation early, preserve user trust, and keep salon‑booking conversions healthy.

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