# Android native UI > Use when building or reviewing Android interfaces in Compose or Views. Build or review Android interfaces in Compose or Views, including Material conventions, accessibility, adaptive layout, and state. ## Facts - Type: Agent skill - Discipline: Design - Author: Karl Koch (https://github.com/kemiljk) - Upstream: https://github.com/kemiljk/skills/blob/main/skills/android-native-ui/SKILL.md - Source file: https://raw.githubusercontent.com/kemiljk/skills/main/skills/android-native-ui/SKILL.md (4425 bytes, sha256:855675dd8dc789229ff265a88663890324702a60806ab8f81b96a5d3b2898f98) - Licence: MIT - Upstream copy last changed: 2026-09-17 - Status: listed, not yet ruled on by the curator ## Use it I want to use the Android native UI skill by Karl Koch. This is what it does, in the author's own words: Build or review Android interfaces in Compose or Views, including Material conventions, accessibility, adaptive layout, and state. Download the whole folder at https://github.com/kemiljk/skills/tree/main/skills/android-native-ui, SKILL.md and every file beside it, into your skills directory: ~/.claude/skills/android-native-ui/ for Claude Code, ~/.agents/skills/android-native-ui/ for Codex, ~/.cursor/skills/android-native-ui/ for Cursor. Get it from the author's repo, not from startupskills.dev. Then tell me the path you installed it to and how to invoke it. Nothing here is vendored: install from the author's repo, not from this site. A verbatim copy of the author's file follows for reading, under the licence reproduced after it; the current file is in the author's repo. ## Links - Page: https://startupskills.dev/kemiljk/android-native-ui - Author: https://startupskills.dev/kemiljk - Index: https://startupskills.dev/llms.txt ## The file itself --- name: android-native-ui description: "Build or review Android interfaces in Compose or Views, including Material conventions, accessibility, adaptive layout, and state." license: MIT --- # Android Native UI Build and review Android interfaces around platform contracts: Compose semantics, lifecycle-aware state, adaptive windows, Material/system integration, back navigation, and accessibility—not web ARIA or pixel-only parity. ## Identify the UI boundary Map Android Views versus Compose, Material 3/custom design system, minimum SDK, navigation library, state holder, and whether the project is Android-only or Compose Multiplatform. For Compose Multiplatform, keep portable UI in `commonMain`; isolate Android APIs such as `Context`, permissions, back handling, and window APIs at the platform boundary. Verify each shipped target independently. ## Fresh platform guidance Before prescribing or implementing APIs, behaviour, Material conventions, tooling, or verification that may vary by Android/Compose/Kotlin release, search current primary Android sources: `developer.android.com`, AndroidX release notes, and Kotlin documentation where relevant. Check the project's SDK, Compose BOM/library versions, and shipped Compose Multiplatform targets before recommending an API. The examples here express durable contracts; they are not a substitute for release-specific documentation. ## State, effects, and component APIs Hoist state only as high as the caller that needs to control it. Model durable screen state separately from one-shot events. Collect flows with lifecycle awareness on Android, and use `LaunchedEffect`, `DisposableEffect`, or other explicit effects for imperative work—not a composable body. ```kotlin @Composable fun SaveButton( enabled: Boolean, onSave: () -> Unit, modifier: Modifier = Modifier, ) { Button( onClick = onSave, enabled = enabled, modifier = modifier, ) { Text("Save") } } ``` Reusable composables should expose a `Modifier` at the outer boundary, preserve native control semantics, and avoid growing boolean/primitive parameter lists where a state model or slot is clearer. Check modifier order deliberately: hit targets, clipping, padding, indication, and semantics can change with order. ## Compose performance and motion Composition, layout, and drawing are different phases. Do not write layout-derived state that a sibling reads during composition without proving the feedback loop is safe. Avoid expensive allocations or collection work in hot composable bodies; use stable keys in lazy collections. Read animation, scroll, and gesture state in the latest phase that can produce the intended effect. Animations should be state-driven, cancellable where interaction demands it, and usable when Android's animator duration scale is reduced or disabled. Wait for the visible or semantic completion condition before counting animations or reading final state. ## Accessibility and adaptation Compose uses a semantics tree, not ARIA. Test content descriptions, roles, state descriptions, custom actions, traversal order, merged semantics, focus, TalkBack, touch targets, and disabled state. `contentDescription = null` is correct only for decorative content. Use window size classes and available space rather than device labels. Test compact and expanded windows, large font scale, dark theme, display cutouts/insets, keyboard, layout direction, and predictive/system back where relevant. ```kotlin Icon( imageVector = Icons.Default.Star, contentDescription = null, // decorative beside visible text ) ``` Read [references/android-verification.md](references/android-verification.md) before making rendered Android claims. It contains the minimum evidence lane and semantics-based examples. ## Prefer / reject | Prefer | Reject | | --- | --- | | Material/native control semantics with intentional theming | Clickable layout that loses role, state, or keyboard/accessibility behaviour | | Immutable UI state and lifecycle-aware collection | Side effects or mutable event handling in composition | | Stable lazy keys and phase-appropriate reads | Index keys and composition/layout feedback loops | | Semantics tests plus rendered checks | Screenshot-only claims about accessibility or state | | Window-size adaptation | Phone-only layouts stretched across tablets, foldables, and desktop | ## Licence of the file above The file above is https://raw.githubusercontent.com/kemiljk/skills/main/skills/android-native-ui/SKILL.md, by Karl Koch, reproduced without changes. - Source: https://github.com/kemiljk/skills/blob/main/skills/android-native-ui/SKILL.md - Copyright: Copyright (c) 2026 Karl Koch - Licence: MIT, https://raw.githubusercontent.com/kemiljk/skills/main/LICENSE The repo's licence file, verbatim from https://raw.githubusercontent.com/kemiljk/skills/main/LICENSE: MIT License Copyright (c) 2026 Karl Koch Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.