Get started with adaptive apps  |  Jetpack Compose  |  Android Developers Skip to main content Essentials Build AI experiences Build AI-powered Android apps with Gemini APIs and more. Get started Get started Create your first app. Use Compose for UI and adaptive app development to support multiple device form factors. Hello, world! Developer Verification Adaptive apps Compose for UI AI-powered IDE Training Monetization with Play ↗️ Optimize by form factor Build apps that optimize the user experience on phones, tablets, foldables, cars, XR, and more. Phones, tablets, foldables Android for Cars Android TV Android XR Googlebook ChromeOS Wear OS Build by category Learn to build for your use case by following Google's prescriptive and opinionated guidance. Games Camera & media Social & messaging Health & fitness Productivity Enterprise apps Get the latest Stay in touch with the latest releases throughout the year, join our preview programs, and give us your feedback. Latest updates Experimental updates Android Studio preview Jetpack & Compose libraries Wear OS releases Privacy Sandbox ↗️ Design & Plan Excellent Experiences Build the best experiences for your best users. Learn more UI Design Design a beautiful user interface using Android best practices. Design for Android Mobile Desktop experiences XR Headsets & XR Glasses AI Glasses Widgets Wear OS Android TV Android for Cars Architecture Design robust, testable, and maintainable app logic and services. Introduction Libraries Navigation Modularization Testing Kotlin Multiplatform Quality Plan for app quality and align with Play store guidelines. Overview Core value User experience Accessibility Technical quality Excellent Experiences Security Safeguard users against threats and ensure a secure Android experience. Overview Privacy Permissions Identity Fraud prevention Develop Gemini in Android Studio Your AI development companion for Android development. Learn more Get Android Studio Core areas Get the samples and docs for the features you need. Samples Multidevice support User interfaces Background work Data and files Connectivity All core areas ⤵️ Tools and workflow Use the IDE to write and build your app, or create your own pipeline. Write and debug code Build projects Test your app Performance Command-line tools Gradle plugin API Android Bench Device tech Write code for form factors. Connect devices and share data. Phones, tablets, foldables ChromeOS Android for Cars Android TV Android XR Wear OS Android Health Better Together All devices ⤵️ Libraries Browse API reference documentation with all the details. Android platform Jetpack libraries Compose libraries Google Play services ↗️ Google Play SDK index ↗️ Google Play Play Console Publish your app or game and grow your business on Google Play. Go to Play Console Learn more ↗️ Fundamentals Learn how to engage users, monitize, and secure your app. Play Monetization Play Integrity Play Policies Play Programs ↗️ Games Dev Center Develop and deliver games. Get tools, downloads, and samples. Overview Play Asset Delivery Play Games Services Play Games on PC Level Up guidelines All Play guides ⤵️ Libraries Browse API reference documentation with all the details. Play Feature Delivery Play In-app Updates Play In-app Reviews Play Install Referrer Google Play services ↗️ Google Play SDK index ↗️ All Play libraries ⤵️ Tools & resources Tools for publishing, promoting, and managing your app. Android App Bundles Brand & marketing Play Console APIs ↗️ Blog the Android Developer's Blog Read the latest Explore the authors → Explore categories Case Studies Real-world results from real-world users. Explore how different teams use our tools to achieve their goals. Events & Programs Get the details on upcoming webinars, workshops, meetups, and special initiatives designed to help you grow. Product News Stay in the loop with the latest updates, feature releases, and behind-the-scenes looks at how we’re evolving. Community Discover stories from our users, spotlight features, and the collaborative projects that bring us all together. How-tos From quick tips to deep-dive tutorials, these step-by-step guides are designed to help you work smarter and faster. / English Deutsch Español – América Latina Français Indonesia Italiano Polski Português – Brasil Tiếng Việt Türkçe Русский עברית العربيّة فارسی हिंदी বাংলা ภาษาไทย 中文 – 简体 中文 – 繁體 日本語 한국어 Android Studio Sign in Develop Core areas UI Overview Tutorial Samples Docs Quick Guides Essentials More Design & Plan More Develop More Overview Tutorial Samples Docs Quick Guides Google Play More Blog More Android Studio Introduction Documentation Compose-first development Quick start Setup Compose Dependencies and Compiler Thinking in Compose Build adaptive apps Bill of Materials Using the Bill of Materials BOM to library version mapping UI architecture Lifecycle Side-effects Phases Managing state Overview Where to hoist state Save UI state State lifespans State callbacks Architecture Architectural layering CompositionLocal Navigation ⍈ App layout Layout fundamentals Overview Layout basics Modifiers Constraints and modifier order Custom modifiers List of modifiers Layout containers Lazy lists and lazy grids Pager Flow layouts Grid Overview Get started Set container properties Set item properties FlexBox Overview Get started Set container behavior Set item behavior Adaptive layouts Fundamentals Get started with adaptive apps App orientation, aspect ratio, and resizability Support multi-window mode Adaptive do’s and don’ts Sizing strategies Use window size classes Support different display sizes Query information for adaptive layouts Layout patterns Canonical layouts Build a list-detail layout Build a supporting pane layout Build adaptive navigation Device-specific support Support connected displays Support desktop windowing Support camera on multiple form factors Foldables Learn about foldables Make your app fold-aware Support foldable display modes Support trifolds and landscape foldables Advanced and custom layouts Custom layouts Alignment lines Intrinsic measurements Visibility tracking Components Overview App bars Overview Navigate from top app bar Create a dynamic top app bar Badges Bottom sheets Overview Partial bottom sheet Button Overview Floating action button Icon button Segmented button Card Carousel Checkbox Chip Date pickers Dialog Divider Menus Navigation bar Navigation drawer Navigation rail Progress indicators Pull to refresh Radio button Resources Scaffold Search bar Slider Snackbar Switch Tabs Time pickers Overview Time picker dialogs Tooltip Theming Overview Material Design 3 Migrate from Material 2 to Material 3 Material Design 2 Custom theming Anatomy of a theme Migrating XML themes to Compose Styles Overview Fundamentals of Styles State and animations in Styles Styles vs modifiers Theming with Styles Performance of Styles Do's and don'ts Examples using Styles Limitations of Styles Text and typography Overview Display and style text Display text from resource Style text Style paragraph Configure text layout Handle user input Configure text fields Migrate to state-based text fields Enable user interactions Work with fonts Display emoji Enable Autofill Images and graphics Overview Images Overview Loading images ImageBitmap vs ImageVector Material icons Customize an image Custom painter Optimizing bitmaps Graphics Overview Graphics Modifiers Brush and gradients Mesh gradients Shapes Shadows Animation Overview Choose an animation API Quick guide Animation modifiers and composables Value-based animations Animated vector images Advanced animation example Customize animations Shared elements Overview Customize Common use cases With navigation Additional samples Test animations Tools Additional resources Accessibility Overview API defaults Semantics Modify traversal order Support user-scalable content Merging and clearing Inspect and debug Testing Touch and input Overview Pointer input Overview Understand gestures Tap and press Drag, swipe, and fling Multi-touch gestures Scroll Scroll modifiers Nested scroll modifiers Two-dimensional scrolling Keyboard input Handle keyboard actions Keyboard Shortcuts Helper Focus Overview Change focus traversal order Change focus behavior React to focus User interactions Handling interactions Migrate to Indication and Ripple APIs Drag and drop Swipe to dismiss or update Stylus input Overview Stylus input in text fields Advanced stylus features Note-taking apps Ink API About the Ink API Add dependencies Pick your module Define your brushes Draw a stroke Create interactive tools with the Geometry APIs Manage state and storage Choose your epsilon and coordinate system Copy and paste Input compatibility on large screens Performance Overview Hero benchmarks Phases Baseline profiles Stability Overview Diagnose stability issues Fix stability issues Strong skipping Tools Best practices Style guidelines Compose API guidelines Kotlin for Compose UI testing Overview Cheatsheet Semantics Testing APIs Migrate to v2 testing APIs Synchronize tests Interoperability Common patterns Debug tests Migrate to Compose Migrate XML Views to Jetpack Compose Migration strategy Interoperability APIs Overview Using Compose in Views Using Views in Compose Wrap a WebView in Compose Common migration scenarios Migrate RecyclerView to Compose Migrate CoordinatorLayout to Compose Migrate Jetpack Navigation to Navigation Compose Other considerations Adopt Compose for teams Compose and other libraries Compare Compose and View metrics Tools Overview Design Preview your UI Preview and debug animations Develop Develop code iteratively Editor actions Lint Debug Overview Trace app performance Stack traces System capabilities Notifications About notifications Create a notification Notification permission Notification channels Expandable notifications Bubbles Progress-centric notifications Call-style notifications Live updates Window insets Set up edge-to-edge About WindowInsetsRulers About window insets Set up window insets Use keyboard IME animations Use Material 3 insets Use insets in Views and Compose About system bar protection Cutouts About cutouts Test how your content renders with cutouts Picture-in-picture About PiP Set up your app for PiP Enter PiP at correct times Add PiP through a button Add remote actions to PiP Use the Jetpack PiP library Predictive back About predictive back Set up predictive back Access progress manually Test predictive back App shortcuts About shortcuts Create shortcuts Add capabilities to shortcuts Manage shortcuts Implement best practices for shortcuts Adaptive icons Bubbles Create widgets Overview Glance setup Create an app widget with Glance Enhance your widget Enable widget configuration Add generated previews to your widget picker Pin Glance widgets in-app Handle errors with Glance Unit testing with Glance Handle user interaction with Glance Track metrics for your widget Manage and update GlanceAppWidget Build UI with Glance Implement a Glance theme Glance interoperability Additional resources Build AI experiences Get started Get started Hello, world! Developer Verification Adaptive apps Compose for UI AI-powered IDE Training Monetization with Play ↗️ Optimize by form factor Phones, tablets, foldables Android for Cars Android TV Android XR Googlebook ChromeOS Wear OS Build by category Games Camera & media Social & messaging Health & fitness Productivity Enterprise apps Get the latest Latest updates Experimental updates Android Studio preview Jetpack & Compose libraries Wear OS releases Privacy Sandbox ↗️ Excellent Experiences Learn more UI Design Design for Android Mobile Desktop experiences XR Headsets & XR Glasses AI Glasses Widgets Wear OS Android TV Android for Cars Architecture Introduction Libraries Navigation Modularization Testing Kotlin Multiplatform Quality Overview Core value User experience Accessibility Technical quality Excellent Experiences Security Overview Privacy Permissions Identity Fraud prevention Gemini in Android Studio Learn more Get Android Studio Core areas Samples Multidevice support User interfaces Background work Data and files Connectivity All core areas ⤵️ Tools and workflow Write and debug code Build projects Test your app Performance Command-line tools Gradle plugin API Android Bench Device tech Phones, tablets, foldables ChromeOS Android for Cars Android TV Android XR Wear OS Android Health Better Together All devices ⤵️ Libraries Android platform Jetpack libraries Compose libraries Google Play services ↗️ Google Play SDK index ↗️ Play Console Go to Play Console Learn more ↗️ Fundamentals Play Monetization Play Integrity Play Policies Play Programs ↗️ Games Dev Center Overview Play Asset Delivery Play Games Services Play Games on PC Level Up guidelines All Play guides ⤵️ Libraries Play Feature Delivery Play In-app Updates Play In-app Reviews Play Install Referrer Google Play services ↗️ Google Play SDK index ↗️ All Play libraries ⤵️ Tools & resources Android App Bundles Brand & marketing Play Console APIs ↗️ the Android Developer's Blog Read the latest Explore the authors → Explore categories Case Studies Events & Programs Product News Community How-tos Android Developers Develop Core areas UI Docs Get started with adaptive apps Stay organized with collections Save and categorize content based on your preferences. More than 300 million Android large screen devices, including tablets, foldables, ChromeOS devices, car displays, and TVs, are in use today, with more coming continually. To provide an optimal user experience on the growing number and diversity of large screen devices—as well as on standard phones—build adaptive apps. What are adaptive apps? Adaptive apps change layouts based on changes in the app display, primarily the size of the app window. But adaptive apps also accommodate changes in the posture of foldable devices, such as tabletop or book posture, and changes in screen density and font size. Instead of just stretching or shrinking UI elements in response to different window sizes, adaptive apps replace layout components and show or hide content. For example, on standard phones, an adaptive app might display a bottom navigation bar, but on large screens, a navigation rail. On large screens, adaptive apps display more content, such as a two-pane, list-detail layout; on small screens, less content, either the list or the detail. Your browser doesn't support the video tag. Figure 1. Adaptive app optimizes layout for different window sizes. In the past, apps typically ran full screen. Today, apps run in multi-window mode in arbitrarily sized windows independent of the device screen size. Users can change the window size at any time. So even on a single device type, apps must be adaptive. Adaptive apps look great and work well on any device in any configuration. Why build adaptive UIs? Users expect your app to function flawlessly on all their devices and provide enhanced capabilities on large screens. Users multitask in multi-window mode for an enhanced app experience and increased productivity. Apps limited to single-tasking on standard phones miss out on an expanding user base of diverse possibilities. Google Play Google Play provides tablet- and foldable-specific app collections and recommendations, which enable users to discover high-quality apps. Play ranks apps and games optimized for large screens higher than unoptimized apps. Play bases the ranking on the large screen app quality guidelines. Higher ranking increases discoverability by enabling multi‑device users to see large screen–specific ratings and reviews on their phones. Apps that don't meet the Play Store's large screen quality standards display a warning on the app details page. The warning advises users that the app might not perform well on their large screen devices. Figure 2. Technical quality warning on app details page. Build adaptive apps to broaden discoverability on Google Play and maximize the number of devices that can download your app. How to get started Think about adaptive design in all phases of app development from planning to deployment. Inform graphic designers about adaptive design. Design your app to be adaptive, and you'll build an app that's manageable, extensible, and ready for future form factors and windowing modes. To create an adaptive app that supports all display sizes and configurations, do the following: Use window size classes to make layout decisions Build with the Compose Material 3 Adaptive library Support input beyond touch Test on all device types Window size classes App window dimensions can be different on different devices—or on the same device in the case of foldables—even when the app is full screen. Different device orientations produce different aspect ratios. In multi‑window mode, app window size, aspect ratio, and orientation can differ from that of the device screen. Adaptive apps simplify and generalize the problem of determining and managing window size, aspect ratio, and orientation by considering only the app window when rendering layouts, which also works when the app window is the full screen. Window size classes categorize app windows as compact, medium, or expanded based on window width or height. Figure 3. Window size classes based on display width. Note: Because vertical scrolling is commonplace, window width is typically the main consideration in determining window size class. Compute your app's WindowSizeClass using the currentWindowAdaptiveInfo() top‑level function of the Compose Material 3 Adaptive library. The function returns an instance of WindowAdaptiveInfo, which contains windowSizeClass. Your app receives updates whenever the window size class changes: val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass AdaptiveLayoutSnippets.kt Content panes An activity's layout is sometimes referred to as a screen. For example, your app might have a home screen, a list screen, and an item detail screen. The terminology implies that each activity fills the device screen. However, on device screens that are large enough to support the expanded width window size class, multiple activity screens can be onscreen at the same time. Pane is a more precise term for content displays of individual activities. Window size classes enable you to determine how many content panes to show in multi‑pane layouts, as specified in Material Design. Figure 4. Number of content panes per window size class. Panes are navigable. On compact and medium window size classes, apps display a single pane; and so, navigation to any destination displays one pane. On the expanded window size class, apps can display related content in multiple panes, such as a list‑detail layout. Navigation to either pane displays the two‑pane layout. If the window size changes to compact or medium, adaptive apps show only one pane, the navigation destination, either the list or the detail. Your browser doesn't support the video tag. Figure 5. List-detail layout with list pane as navigation target. Your browser doesn me support the video tag. Figure 6. List-detail layout with detail pane as navigation target. Compose Material 3 Adaptive Jetpack Compose is the modern, declarative approach to building adaptive apps without the duplication and maintenance burden of multiple layout files. The Compose Material 3 Adaptive library contains composables that manage window size classes, navigation components, multi‑pane layouts, and foldable postures and hinge location, for example: NavigationSuiteScaffold: Automatically switches between navigation bar and navigation rail depending on app window size class and device posture. ListDetailPaneScaffold: Implements the list-detail canonical layout. Adapts the layout to the app window size. Presents a list and the detail of a list item in side‑by‑side panes on the expanded window size class, but just the list or the detail on compact and medium window size classes. SupportingPaneScaffold: Implements the supporting pane canonical layout. Presents the main content pane and a supporting pane on the expanded window size class, but just the main content pane on compact and medium window size classes. The Compose Material 3 Adaptive library is a key dependency for developing adaptive apps. Configuration and continuity Adaptive apps retain continuity during configuration changes. A configuration change occurs when the app window is resized, the posture of a foldable changes, or the screen density or font changes. By default, configuration changes recreate the app activity, and all activity state is lost. To maintain continuity, adaptive apps save state in the activity's onSaveInstanceState() method or in a ViewModel. Posture Adaptive apps respond to changes in the posture of foldable devices. Postures include tabletop and book posture. Figure 7. Foldable device in tabletop posture. The WindowInfoTracker interface in Jetpack WindowManager lets you to obtain a list of DisplayFeature objects for the device. Among the display features is FoldingFeature.State, which indicates whether the device is fully or half open. The Compose Material 3 Adaptive library provides the currentWindowAdaptiveInfo() top‑level function, which returns an instance of WindowAdaptiveInfo containing windowPosture. Input beyond touch Users often connect external keyboards, trackpads, mice, and styluses to large screen devices. The peripherals enhance user productivity, input precision, personal expression, and accessibility. Most ChromeOS devices come with keyboards and trackpads built in. Adaptive apps support external input devices, but the Android framework does much of the work for you: Jetpack Compose 1.7 and higher: Keyboard tab navigation and mouse or trackpad click, select, and scroll are supported by default. Jetpack androidx.compose.material3 library: Enables users to write into any TextField component using a stylus. Keyboard Shortcuts Helper: Makes Android platform and app keyboard shortcuts discoverable by users. Publish your app's keyboard shortcuts in Keyboard Shortcuts Helper by overriding the onProvideKeyboardShortcuts() window callback. To fully support form factors of all sizes, adaptive apps support input of all types. How to test adaptive apps Test different screen and window sizes and different device configurations. Use host‑side screenshots and Compose previews to check your app layouts. Run your app on Android Studio emulators and remote Android devices hosted in Google data centers. Large screen app quality guidelines The large screen app quality guidelines help you verify that your adaptive app works well on tablets, foldables, and ChromeOS devices. The guidelines include tests that enable you to verify app functionality for critical user journeys. Although the guidelines focus on large screens, they're compatible with all screen sizes. Multiple configurations The DeviceConfigurationOverride interface in Compose 1.7 and higher lets you to override various aspects of device configuration. The API simulates different device configurations in a localized way for whatever composable content you want to test. For example, you can test multiple, arbitrary UI sizes in a single run of your test suite on a single device or emulator. With the DeviceConfigurationOverride.then() extension function, you can test multiple configuration parameters, such as font size, locale, theme, and layout size, all at the same time. Host-side screenshots Host-side screenshot tests are a fast and scalable way of verifying the visual appearance of your app layouts. Use host-side screenshots to test your UI for a variety of display sizes. For more information, see Compose Preview Screenshot Testing. Compose previews Compose previews let you check your app's UI in the design view of Android Studio. Previews use annotations, such as @PreviewScreenSizes, @PreviewFontScale, and @PreviewLightDark to let you see composable content in various configurations. You can even interact with the previews. Android Studio also highlights common usability issues in previews, such as buttons or text fields that are too wide. For more information, see Preview your UI with composable previews. Emulators Android Studio offers a variety of emulators for testing different layout sizes: Resizable emulator: Emulates a phone, tablet, or foldable device and lets you switch between them on the fly Pixel Fold emulator: Emulates the Pixel Fold large screen foldable phone Pixel Tablet emulator: Emulates the Pixel Tablet large screen device Desktop emulator: Lets you test free-form windowing, mouse hover, and keyboard shortcuts Remote device streaming Securely connect to remote Android devices hosted in Google data centers and run your app on the latest Pixel and Samsung devices. Install and debug apps, run ADB commands, and rotate and fold devices to verify that your app works well on a variety of real devices. Remote device streaming is integrated into Android Studio. For more information, see Android Device Streaming, powered by Firebase. Additional resources I/O presentation: Building adaptive Android apps Previous arrow_back Set item behavior Next App orientation, aspect ratio, and resizability arrow_forward Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates. Last updated 2026-06-16 UTC. [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2026-06-16 UTC."],[],[]] X Follow @AndroidDev on X YouTube Check out Android Developers on YouTube LinkedIn Connect with the Android Developers community on LinkedIn More Android Android Android for Enterprise Security Source News Blog Podcasts Discover Gaming Machine Learning Health & Fitness Camera & Media Privacy 5G Android Devices Large screens Wear OS ChromeOS devices Android for cars Android TV Releases Android 17 Android 16 Android 15 Android 14 Android 13 Android 12 Android 11 Documentation and Downloads Android Studio guide Developers guides API reference Download Studio Android NDK Support Report platform bug Report documentation bug Google Play support Join research studies Android Chrome Firebase Google Cloud Platform All products Privacy License Brand guidelines Manage cookies Get news and tips by email Subscribe English Deutsch Español – América Latina Français Indonesia Italiano Polski Português – Brasil Tiếng Việt Türkçe Русский עברית العربيّة فارسی हिंदी বাংলা ภาษาไทย 中文 – 简体 中文 – 繁體 日本語 한국어