Android Coden
Android 5 min lesen

Navigation Rail und Drawer

Optimiere deine App für große Bildschirme. Lerne, wie du responsive Layouts für Tablets und Foldables mit Navigation Rail und Drawer entwickelst.

Die Gestaltung von Apps für Android hat sich in den letzten Jahren enorm weiterentwickelt. Wo man früher nahezu exklusiv für Smartphones im Hochformat programmierte, müssen moderne Applikationen heute unterschiedlichste Formfaktoren unterstützen. Von hochauflösenden Tablets über Desktop-Umgebungen wie ChromeOS bis hin zu faltbaren Displays existiert eine Vielfalt an Layout-Anforderungen. Wenn der verfügbare Raum auf dem Bildschirm in die Breite wächst, stößt eine gewöhnliche Navigation am unteren Rand rasch an ihre ergonomischen und optischen Grenzen. An diesem entscheidenden Punkt kommen Muster wie die Navigation Rail und der Navigation Drawer zum Einsatz. Diese strukturellen Elemente erlauben es dir, den breiteren Platz sinnvoll aufzuteilen und dem Nutzer eine stets greifbare, gut bedienbare Benutzeroberfläche zu präsentieren.

Was ist das?

Eine herkömmliche Leiste am unteren Rand, meist Bottom Navigation genannt, funktioniert hervorragend auf den eher schmalen Displays klassischer Mobiltelefone. Sie platziert die essenziellen Einstiegspunkte der Anwendung in direkter Reichweite der Daumen. Betrachtest du deine App jedoch auf einem Tablet im Querformat oder auf dem inneren Display eines vollständig geöffneten Foldables, verliert dieses Konzept seine Stärken. Die Icons rücken zu weit auseinander oder wirken verloren in der Mitte des Bildschirms.

Genau hier bietet die Navigation Rail eine robuste Alternative. Sie stellt das vertikale Pendant zur Bottom Navigation dar. Statt am unteren Bildschirmrand platziert zu werden, verankert sich die Navigation Rail an der linken Seite des Bildschirms, beziehungsweise an der rechten Seite bei Systemen mit einer Rechts-nach-Links-Ausrichtung. Sie benötigt extrem wenig horizontalen Platz und gewährt dennoch schnellen Zugriff auf drei bis maximal sieben zentrale Bereiche. Da sie seitlich angeordnet ist, bleibt der vertikale Raum vollständig für den eigentlichen Inhalt reserviert. Gerade bei Listen, Artikeln oder Rasteransichten bringt dies einen immensen Vorteil für den Lesefluss und die Übersichtlichkeit.

Der Navigation Drawer ist die größere, erweiterte Form dieser seitlichen Navigation. Er reserviert nicht nur Fläche für kleine Icons, sondern bietet genügend Raum für ausgeschriebene Bezeichnungen, detaillierte Profilinformationen sowie organisatorische Trennlinien. Besonders bei sehr großen Bildschirmen bietet sich ein sogenannter Permanent Navigation Drawer an, der kontinuierlich sichtbar am Rand verbleibt. Der Nutzer muss kein Menü-Icon mehr betätigen, sondern sieht alle verfügbaren Sektionen der Applikation auf einen Blick. Das Verständnis für diese verschiedenen Komponenten bildet das Fundament für adaptives Design unter Android.

Wie funktioniert es?

Die technische Umsetzung dieser adaptiven Navigation stützt sich maßgeblich auf die sogenannten Window Size Classes. Das Android-Betriebssystem klassifiziert die Breite des aktuellen Fensters in drei primäre Kategorien: Compact, Medium und Expanded.

Fällt das Fenster in die Kategorie Compact, was bei den meisten Smartphones im Hochformat der Fall ist, verwendest du weiterhin die klassische Variante am unteren Rand. Sobald sich das Gerät im Querformat befindet oder es sich um ein kleineres Tablet handelt, meldet das System die Kategorie Medium. Dies ist das optimale Einsatzszenario für eine Navigation Rail. Bei großen Tablets oder maximierten Fenstern auf ChromeOS greift die Kategorie Expanded, bei der ein Permanent Navigation Drawer die beste Wahl ist.

In Jetpack Compose reagierst du deklarativ auf diese Veränderungen. Du ermittelst die aktuelle Fensterbreite und bindest das passende Composable in deinen UI-Baum ein. Eine Navigation Rail in Compose nimmt ähnlich wie die Variante am unteren Rand mehrere Elemente auf, die jeweils ein Icon und eine Option zur Auswahlbestätigung definieren. Die Compose-Bibliothek ermöglicht dir einen sauberen, statusgetriebenen Aufbau. Der interne State deiner Applikation, etwa welcher Tab gerade aktiv ist, bleibt dabei strikt vom visuellen Element getrennt.

Wenn der Nutzer das Gerät dreht oder ein Foldable aufklappt, führt dies lediglich zu einer sogenannten Recomposition. Jetpack Compose stellt fest, dass sich die Window Size Class geändert hat, blendet die bisherige Leiste aus und fügt stattdessen die Navigation Rail oder den Drawer ein. Die zugrundeliegende Navigationsstruktur, üblicherweise gesteuert durch einen NavController, arbeitet ungestört weiter und liefert den aktuellen Zustand nahtlos an die neue Darstellungskomponente.

In der Praxis

In deinem Entwickleralltag ist es entscheidend, die visuelle Darstellung strikt von der Navigationslogik zu separieren. Eine saubere Architektur verhindert, dass du Code für den Navigationswechsel an mehreren Stellen duplizieren musst. Der Navigationsstatus sollte zentral verwaltet werden, damit du je nach verfügbarer Breite lediglich die Container austauschen musst.

Hier ist ein konkretes Beispiel, das zeigt, wie du die verschiedenen Menüs abhängig von der Fenstergröße orchestrierst:

@Composable
fun AdaptiveAppScreen(
    windowSizeClass: WindowWidthSizeClass,
    currentRoute: String,
    onNavigate: (String) -> Unit
) {
    val isExpanded = windowSizeClass == WindowWidthSizeClass.Expanded
    val isMedium = windowSizeClass == WindowWidthSizeClass.Medium

    Row(modifier = Modifier.fillMaxSize()) {
        if (isMedium) {
            AppNavigationRail(
                currentRoute = currentRoute,
                onNavigate = onNavigate
            )
        } else if (isExpanded) {
            AppPermanentDrawer(
                currentRoute = currentRoute,
                onNavigate = onNavigate
            )
        }

        Scaffold(
            bottomBar = {
                if (!isMedium && !isExpanded) {
                    AppBottomBar(
                        currentRoute = currentRoute,
                        onNavigate = onNavigate
                    )
                }
            }
        ) { paddingValues ->
            MainContent(modifier = Modifier.padding(paddingValues))
        }
    }
}

Eine häufige Stolperfalle bei der Implementierung seitlicher Navigationselemente ist das Übersehen der System Insets. Wenn du eine Navigation Rail stur an den Rand des Bildschirms setzt, läufst du Gefahr, dass sie durch eine transparente System-Navigationsleiste, durch abgerundete Display-Ecken oder sogar durch Kameramodule verdeckt wird. In Jetpack Compose nutzt du dafür WindowInsets. Material-3-Komponenten wenden dieses Konzept oft bereits automatisch an, doch sobald du eigene Anpassungen am Layout vornimmst, musst du explizit prüfen, ob die interaktiven Flächen frei zugänglich sind.

Fazit

Der bewusste Wechsel von einer starren Navigation am Bildschirmrand hin zu einem adaptiven Modell mit Navigation Rail und Drawer ist ein enorm wichtiger Meilenstein für die Qualität deiner Applikation. Du bist nun in der Lage, den zur Verfügung stehenden Raum durch Window Size Classes dynamisch zu analysieren und die passenden Composables einzusetzen. Um dein Wissen abzusichern, solltest du in Android Studio das Resizable-Profil im Emulator starten. Falte das virtuelle Gerät auf, wechsle in das Querformat und beobachte, wie deine Architektur flexibel reagiert. So gewährleistest du, dass die Navigationsobjekte jederzeit ideal platziert sind und dein Code für jede Displaygröße robust bleibt.

Quellen (2)
Redaktion

Geschrieben von

Redaktion

Das Redaktionsteam recherchiert und schreibt Artikel zu aktuellen Themen rund um Tech, Lifestyle und Ratgeber.