Drawer (Navigation Drawer) एक इंटरैक्टिव पैनल है जो स्क्रीन के बाएँ (या दाएँ) किनारे से बाहर स्लाइड करता है और नेविगेशन लिंक प्रदर्शित करता है। Android पर यह DrawerLayout के माध्यम से कार्यान्वित किया जाता है, iOS पर — SideMenu जैसे कस्टम समाधानों या iPad पर मानक UISplitViewController के माध्यम से। विनिर्देश के बारे में अधिक जानकारी के लिए Material Design 3 दस्तावेज़ीकरण देखें।
मुख्य बिंदु
Drawer (Navigation Drawer) एक नेविगेशन तत्व है जो पैनल के रूप में होता है जो स्वाइप जेस्चर या हैमबर्गर आइकन (तीन क्षैतिज रेखाएँ) पर टैप करके स्क्रीन के बाएँ किनारे से बाहर स्लाइड करता है। Drawer में नेविगेशन लिंक, हेडर और वैकल्पिक तत्व होते हैं: उपयोगकर्ता अवतार, सूचना बैज, विभाजक। पैनल कंटेंट को कवर कर सकता है (Modal) या शिफ्ट कर सकता है (Standard)।
Material Design 3 (2026) Navigation Drawer को 6+ नेविगेशन आइटम वाले ऐप्स के लिए एक घटक के रूप में परिभाषित करता है। Bottom Navigation के विपरीत, Drawer स्क्रीन पर स्थायी स्थान नहीं लेता है और केवल उपयोगकर्ता के अनुरोध पर दिखाया जाता है। यह कंटेंट के लिए स्थान खाली करता है लेकिन खोलने के लिए अतिरिक्त कार्रवाई की आवश्यकता होती है। Google गहरे सेक्शन पदानुक्रम वाले ऐप्स के लिए Drawer की सिफ़ारिश करता है।
UX Planet अनुसंधान (2025) ने दिखाया: Drawer 5–15 सेक्शन वाले ऐप्स के लिए उपयुक्त है, लेकिन नेविगेशन समय Bottom Navigation की तुलना में 40% अधिक है। उपयोगकर्ता स्क्रीन फ़ोल्ड (स्क्रॉल) के नीचे स्थित मेनू आइटम को खो देते हैं। इसलिए महत्वपूर्ण सेक्शन Drawer के शीर्ष पर होने चाहिए, और कम महत्वपूर्ण (ऐप के बारे में, सेटिंग्स) — नीचे, एक विभाजक द्वारा अलग किए गए।
Modal Drawer कंटेंट के ऊपर स्लाइड करता है, पृष्ठभूमि को मंद करता है। मोबाइल उपकरणों के लिए उपयोग किया जाता है जहाँ स्क्रीन की चौड़ाई सीमित होती है। आइटम चुनने के बाद, Drawer स्वचालित रूप से बंद हो जाता है। Standard Drawer (Permanent) एक स्थिर पैनल है जो हमेशा दृश्यमान रहता है, कंटेंट को शिफ्ट करता है। 900 dp से स्क्रीन चौड़ाई वाले टैबलेट और डेस्कटॉप पर उपयोग किया जाता है। Material 3 Rail Drawer भी परिभाषित करता है — टैबलेट के लिए एक कॉम्पैक्ट संस्करण जो केवल आइकन दिखाता है।
| प्रकार | व्यवहार | उपयोग |
|---|---|---|
| Modal | कंटेंट को कवर करता है, पृष्ठभूमि को मंद करता है | फ़ोन, अस्थायी नेविगेशन |
| Standard | कंटेंट को शिफ्ट करता है, स्थिर | टैबलेट, डेस्कटॉप (900+ dp) |
| Rail | आइकन के साथ कॉम्पैक्ट साइड पैनल | टैबलेट, अनुकूली नेविगेशन |
DrawerLayout Android में मानक ViewGroup है जो स्लाइडिंग साइड मेनू लागू करता है। DrawerLayout में दो चाइल्ड तत्व होते हैं: पहला — मुख्य कंटेंट (NavHostFragment के साथ FrameLayout), दूसरा — मेनू के साथ NavigationView। DrawerLayout ActionBarDrawerToggle के माध्यम से स्वाइप जेस्चर और प्रोग्रामेटिक ओपन/क्लोज़ को संभालता है।
// DrawerLayout और NavigationView के साथ गतिविधि
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var drawerLayout: DrawerLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
drawerLayout = binding.drawerLayout
val navView = binding.navView
val navController = findNavController(R.id.nav_host_fragment)
// Drawer को Navigation Component से जोड़ना
NavigationUI.setupActionBarWithNavController(
this, navController, drawerLayout
)
NavigationUI.setupWithNavController(navView, navController)
}
override fun onSupportNavigateUp(): Boolean {
return NavigationUI.navigateUp(
findNavController(R.id.nav_host_fragment),
drawerLayout
)
}
}
// XML: activity_main.xml
// <androidx.drawerlayout.widget.DrawerLayout
// android:id="@+id/drawerLayout"
// ...>
// <!-- मुख्य सामग्री -->
// <FrameLayout android:id="@+id/nav_host_fragment"
// android:layout_width="match_parent"
// android:layout_height="match_parent" />
// <!-- Navigation Drawer -->
// <com.google.android.material.navigation.NavigationView
// android:id="@+id/navView"
// android:layout_width="wrap_content"
// android:layout_height="match_parent"
// android:layout_gravity="start"
// app:menu="@menu/nav_menu" />
// </androidx.drawerlayout.widget.DrawerLayout>NavigationView Drawer कंटेंट के लिए Material Design घटक है। यह हेडर (headerLayout), मेनू आइटम (menu), उपशीर्षक, चेकबॉक्स और स्विच का समर्थन करता है। app:menu विशेषता नेविगेशन आइटम के साथ XML मेनू को इंगित करती है। NavigationUI स्वचालित रूप से सक्रिय आइटम को हाइलाइट करता है और NavController के साथ स्थिति को सिंक्रनाइज़ करता है।
iOS में कोई अंतर्निहित "Drawer" घटक नहीं है — Apple iPhone के लिए साइड मेनू की अनुशंसा नहीं करता है (HIG, 2026)। हालाँकि, iPad के लिए, प्राथमिक और द्वितीयक पैनल के साथ UISplitViewController का उपयोग किया जाता है। iPhone के लिए, साइड मेनू तीसरे पक्ष की लाइब्रेरी (SideMenu, SwiftUI-side-menu) या कंटेंट ऑफ़सेट के साथ कस्टम समाधानों के माध्यम से कार्यान्वित किया जाता है। SwiftUI में, ऑफ़सेट एनिमेशन के साथ ZStack के माध्यम से साइड मेनू बनाया जाता है।
import SwiftUI
struct DrawerView<Content: View, Menu: View>: View {
let menuWidth: CGFloat = 280
@Binding var isOpen: Bool
@ViewBuilder let content: Content
@ViewBuilder let menu: Menu
var body: some View {
ZStack(alignment: .leading) {
content
.offset(x: isOpen ? menuWidth : 0)
.animation(.easeInOut, value: isOpen)
if isOpen {
menu
.frame(width: menuWidth)
.transition(.move(edge: .leading))
Color.black.opacity(0.3)
.ignoresSafeArea()
.onTapGesture { isOpen = false }
}
}
}
}
// उपयोग
struct ContentView: View {
@State private var showDrawer = false
var body: some View {
DrawerView(isOpen: $showDrawer) {
NavigationStack {
HomeView()
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button(action: { showDrawer.toggle() }) {
Image(systemName: "line.horizontal.3")
}
}
}
}
} menu: {
DrawerMenuView()
}
}
}प्रोडक्शन iOS प्रोजेक्ट्स के लिए, SideMenu लाइब्रेरी का अक्सर उपयोग किया जाता है (GitHub, 8k+ स्टार)। यह जेस्चर सपोर्ट, बैकग्राउंड ब्लर, कस्टम चौड़ाई और एनिमेशन के साथ तैयार UIViewController प्रदान करता है। SideMenu बाएँ और दाएँ मेनू, एकाधिक स्तर और UINavigationController के माध्यम से UIKit एकीकरण का समर्थन करता है। विकल्प iPad पर UISplitViewController (सिस्टम, बिना कस्टम एनिमेशन के) है।
Drawer व्यापक कस्टमाइज़ेशन की अनुमति देता है। Android में, NavigationView headerLayout का समर्थन करता है — मेनू आइटम के ऊपर रखा गया कस्टम लेआउट। इसमें अवतार, उपयोगकर्ता नाम, ईमेल और कवर छवि हो सकती है। मेनू आइटम उपशीर्षक, विभाजक और स्विच के साथ <menu> के माध्यम से समूहित किए जाते हैं। iOS पर, SideMenu कस्टमाइज़ेशन में पृष्ठभूमि रंग, ब्लर, चौड़ाई और कोने की त्रिज्या सेट करना शामिल है।
// NavigationView के लिए कस्टम हेडर
val headerView = binding.navView.inflateHeaderView(R.layout.nav_header)
headerView.findViewById<ImageView>(R.id.iv_avatar)
.setImageResource(R.drawable.avatar)
headerView.findViewById<TextView>(R.id.tv_name)
.text = "John Doe"
// मेनू आइटम कॉन्फ़िगर करना
val menuItem = binding.navView.menu.findItem(R.id.nav_notifications)
menuItem.isChecked = true
// बैज जोड़ना
val badge = binding.navView.getOrCreateBadge(R.id.nav_notifications)
badge.number = 15
badge.isVisible = trueMaterial Design निम्नलिखित Drawer संरचना की सिफ़ारिश करता है: हेडर (नाम, अवतार), मुख्य नेविगेशन आइटम (5–8), विभाजक, द्वितीयक आइटम (सेटिंग्स, सहायता), फ़ुटर (ऐप के बारे में, संस्करण)। Material 3 में, NavigationView itemShape और itemBackground के माध्यम से कस्टम सक्रिय आइटम हाइलाइटिंग का भी समर्थन करता है।
Drawer 6+ सेक्शन, सेटिंग्स और सहायता पृष्ठों वाले ऐप्स के लिए प्रभावी है। उन ऐप्स के लिए उपयुक्त नहीं है जहाँ सेक्शन तक त्वरित पहुँच महत्वपूर्ण है — ऐसे मामलों में Bottom Navigation बेहतर है। Material Design Drawer को Bottom Navigation के साथ संयोजित करने की सिफ़ारिश करता है: मुख्य नेविगेशन — Bottom (3–5 टैब), अतिरिक्त — Drawer (सेटिंग्स, सहायता, ऐप के बारे में)।
Drawer लागू करते समय सामान्य गलतियाँ: ओवरलोडेड मेनू (बिना समूहीकरण के 15+ आइटम), फ़ोल्ड के नीचे महत्वपूर्ण सेक्शन छिपाना, आइकन की कमी (आइकन के बिना टेक्स्ट 30% धीमी गति से स्कैन होता है), विलंब के साथ एनिमेशन (≤ 200 ms होना चाहिए)। सर्वोत्तम अभ्यास: उपयोगकर्ता नाम के साथ हेडर, प्रत्येक आइटम के लिए आइकन, समूहों के बीच विभाजक, सक्रिय सेक्शन हाइलाइटिंग, खोलने के लिए स्वाइप जेस्चर समर्थन।
अक्सर पूछे जाने वाले प्रश्न
Drawer एक छिपा हुआ साइड मेनू है जो जेस्चर द्वारा खोला जाता है, 6+ सेक्शन और गहरे पदानुक्रम के लिए उपयुक्त है। Bottom Navigation 3–5 सेक्शन के लिए हमेशा दृश्यमान निचली पट्टी है। Drawer स्क्रीन स्थान बचाता है लेकिन खोलने के लिए अतिरिक्त कार्रवाई की आवश्यकता होती है, जिससे नेविगेशन समय 40% बढ़ जाता है।
SwiftUI में कोई अंतर्निहित Drawer नहीं है। ऊपर दिए गए उदाहरण की तरह कंटेंट ऑफ़सेट और एनिमेशन के साथ ZStack का उपयोग करें। प्रोडक्शन के लिए, लाइब्रेरी का उपयोग किया जाता है: SideMenu (Swift Package) या UISplitViewController पर कस्टम रैपर। iPad पर, preferredDisplayMode .oneBesideSecondary के साथ UISplitViewController का उपयोग करें।
Apple HIG (2026) कहता है: साइड मेनू कंटेंट छिपाता है और प्रत्यक्ष हेरफेर सिद्धांत का उल्लंघन करता है। iOS नेविगेशन के लिए Tab Bar की अनुशंसा करता है। iPhone पर Drawer का उपयोग केवल सेटिंग्स और अतिरिक्त कार्रवाइयों के लिए किया जाता है, मुख्य नेविगेशन के लिए नहीं। iPad पर, Drawer को UISplitViewController से बदल दिया जाता है, जो सिस्टम मानक है।
Android में, DrawerLayout स्वचालित रूप से बाएँ किनारे से स्वाइप को संभालता है। iOS में, कस्टम Drawer के लिए UIPanGestureRecognizer या Edge Pan Gesture (SwiftUI — .gesture DragGesture के साथ) की आवश्यकता होती है। महत्वपूर्ण: स्वाइप को सिस्टम "पीछे" जेस्चर से विरोध करना चाहिए — iOS पर बायाँ किनारा सिस्टम जेस्चर द्वारा घेरा गया है।
हाँ। Android में, NavigationView के लिए android:layout_gravity="end" निर्दिष्ट करें। iOS पर, edge: .trailing के साथ मेनू बनाएँ। दाएँ तरफ का Drawer कम उपयोग किया जाता है — अतिरिक्त विकल्पों, फ़िल्टर या चैट के लिए। मुख्य नेविगेशन Material Design और उपयोगकर्ता अपेक्षाओं के अनुसार बाईं ओर रहता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें