नेविगेशन ड्रावर को दायें से बायें कैसे खोला जाए


85

सबसे पहले मुझे पता है कि यह सवाल पहले यहाँ दिखाई दिया था लेकिन बहुत कोशिश करने के बाद भी मैं सफल नहीं हुआ। मैं एंड्रॉइड डेवलपर्स साइट से उदाहरण पर काम कर रहा हूं ।

मैं मेनू को सेट करने का प्रयास कर रहा हूं कि उदाहरण में इसके कार्यान्वयन से बाएं से दाएं को बाएं से खोला जाए (बाएं से दाएं)। इसके अलावा मैं खुले मेनू बटन को एक्शन बार के दाईं ओर ले जाना चाहता हूं। मैं यहां कुछ उत्तर भी देता हूं, उदाहरण के लिए इस उत्तर में

मैं विचारों और लेआउट की गंभीरता को बदलने की कोशिश करता हूं लेकिन मुझे त्रुटि मिलती है:

पूर्ण गुरुत्वाकर्षण के साथ कोई दराज दृश्य नहीं मिला

क्या आप कृपया मुझे यह पता लगाने में मदद कर सकते हैं कि मेरे कोड में क्या समस्या है और मुझे मेनू को दाईं ओर से खोलने के लिए सेट करने के लिए और एक्शन बार बटन को दाईं ओर ले जाने के लिए मुझे क्या बदलना चाहिए?

xml कोड यहाँ है:

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_gravity="right"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/content_frame"
        android:layoutDirection="rtl"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

    <ListView android:id="@+id/left_drawer"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="10dp"
        android:background="#111"/>

</android.support.v4.widget.DrawerLayout>


Github.com/Ali-Rezaei/SlidingDrawer पर एक नज़र डालें जिससे कोड की कुछ पंक्तियों द्वारा किसी भी ओर से स्लाइड करना संभव हो जाता है।
अली

कृपया उत्तर देखें stackoverflow.com/a/44076363/5332645
अमन सक्सेना

जवाबों:


155

अपने मुख्य लेआउट में अपने ListViewगुरुत्वाकर्षण को दाईं ओर सेट करें :

android:layout_gravity="right" 

आपके कोड में भी:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.drawer_open,
            R.string.drawer_close) {

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item != null && item.getItemId() == android.R.id.home) {
            if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
                mDrawerLayout.closeDrawer(Gravity.RIGHT);
            } 
            else {
                mDrawerLayout.openDrawer(Gravity.RIGHT);
            }
        }
        return false;
    }
};

मुझे भरोसा है ये काम करेगा :)


2
@ रुडी: क्या आपको दूसरे भाग का उत्तर पता है? मेरा मतलब है कि एक्शनबार को बाएं से दाएं कैसे बनाया जाए। (दराज और ऊपर नेविगेशन आइकन की दिशा भी बदल जाती है)
अलीरज़ा फ़रहानी

@alireza क्यों आप एक अनुकूलित एक्शनबार का उपयोग नहीं करते?
रुडी

@ रुडी: आपका मतलब setCustomViewविधि है? यदि हाँ, तो क्या आप कुछ लिंक दिखा रहे हैं जो ऐसा करने का मन बना रहे हैं?
अलीरज़ा फ़रहानी

@alireza का मतलब था, अपने विचार के शीर्ष में एक्शनबार का उपयोग करने के बजाय, अपने कस्टम एक्शनबार को अपने मुख्य xml में बनाएं और इसे यू विश के रूप में सेट करें।
रुडी

@ रुडी: लेकिन फिर, मैं नेविगेशन और ड्रावर ओपन और क्लोज़ एनीमेशन जैसे समान व्यवहार कैसे प्राप्त कर सकता हूं? क्या मुझे उन्हें खरोंच से लागू करना होगा?
अलीरज़ा फ़रहानी 10

62

इस कोड को प्रकट करने के लिए जोड़ें:

<application android:supportsRtl="true">

और फिर Oncreate पर यह कोड लिखें:

getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

इससे मेरा काम बनता है। ;)


1
यह सही उत्तर है, बस शुरू करने के लिए अपनी सूची के गुरुत्वाकर्षण को निर्धारित करें, फिर इस कोड का उपयोग करें, सब कुछ ठीक होना चाहिए
महदी देसी

9
हालांकि, यह काम कर रहा है, setLayoutDirection (View.LAYOUT_DIRECTION_RTL) 17 से ऊपर एपीआई के लिए है, इसलिए आप इसे एपीआई लोअर के लिए उपयोग नहीं कर सकते
मिलाद

6
यह गतिविधि के पूरे लेआउट को फ्लिप नहीं करेगा, यहां तक ​​कि toStartOf / toEndOf, आदि ...?
ट्वीस्टेरोब

13
यह गलत उत्तर है। यह गतिविधि के पूरे लेआउट को दाएं से बाएं घुमाता है।
तरुण

1
सोचा कि यह एक त्वरित समाधान है, लेकिन सही नहीं है।
सिधांशु

37

समाधान


your_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="end">

    <include layout="@layout/app_bar_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:fitsSystemWindows="true"
        app:itemTextColor="@color/black"
        app:menu="@menu/activity_root_drawer" />

</android.support.v4.widget.DrawerLayout>

YourActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
//...
toolbar = (Toolbar) findViewById(R.id.toolbar);

drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();

toolbar.setNavigationOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (drawer.isDrawerOpen(Gravity.RIGHT)) {
                drawer.closeDrawer(Gravity.RIGHT);
            } else {
                drawer.openDrawer(Gravity.RIGHT);
            }
        }
    });
//...
}

2
बहुत अच्छा काम करता है। लेकिन टूलबार आइकन अभी भी बाईं ओर दिखाई देता है। टॉगल बटन आइकन को दाईं ओर कैसे लाया जाए?
दारुश

मैंने android दिया था: Drawerlayout और NavigationView दोनों के लिए लेआउट_ग्रेविटी = "एंड", साथ ही साथ यह ठीक काम कर रहा है।
वरोत्रिया वजसी

toolbar.setNavigationOnClickListenerमिनट
आपी

@ SepJaPro2.4 हां, लेकिन From August 2018, new apps must target at least Android 8.0 (API level 26). From November 2018, app updates must target Android 8.0 (API level 26).(Google)
वलोडिमिर कुल्क

2
एंड्रॉइड जोड़ें: लेआउटडायरेक्शन = "rtl" को अपने AppBarLayout XML में दाईं ओर टॉगल बटन सेट करने के लिए
Terranology

4

यह उत्तर सेट करने के लिए उपयोगी है, नेविगेशन को दाईं से बाईं ओर खुला होना चाहिए, लेकिन इसके आइकन को दाईं ओर सेट करने का कोई समाधान नहीं है। यह कोड इसे ठीक कर सकता है। यदि आप इसे drawerइसके पहले परम के ViewCompat.LAYOUT_DIRECTION_RTLरूप में और इसके दूसरे परम के रूप में देते हैं, तो आरटीएल में प्रवेशित लेआउट स्थापित किया जाएगा। यह एक त्वरित और सरल समाधान है, लेकिन मुझे नहीं लगता कि यह एक सही समाधान हो सकता है, जो केवल मेनू को दाईं से बाईं ओर खोला जाना चाहते हैं और इसके आइकन को दाईं ओर सेट करना चाहते हैं। (हालांकि, यह आपके उद्देश्य पर निर्भर है।) हालांकि, मैं toolbarइसके बजाय देने का सुझाव देता हूं drawer। इस तरह बस टूलबार आरटीएल बन गया है। इसलिए मुझे लगता है कि इन 2 उत्तरों का संयोजन ठीक वही कर सकता है जो आप चाहते हैं।

इन विवरणों के अनुसार, आपका कोड इस तरह होना चाहिए:

(ऑन लाइन विधि में इन पंक्तियों को जोड़ें)

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); // Set it final to fix the error that will be mention below.

    ViewCompat.setLayoutDirection(toolbar, ViewCompat.LAYOUT_DIRECTION_RTL);

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (drawer.isDrawerOpen(Gravity.RIGHT))
                drawer.closeDrawer(Gravity.RIGHT);
            else
                drawer.openDrawer(Gravity.RIGHT);
        }
    });

ध्यान दें कि आपको दराज को अंतिम रूप देना चाहिए, अन्यथा आपको यह त्रुटि मिलेगी:

परिवर्तनीय 'दराज' को आंतरिक वर्ग के भीतर से एक्सेस किया जाता है, इसे अंतिम घोषित किया जाना चाहिए

और उपयोग करने के लिए मत भूलना endके बजाय startमें onNavigationItemSelectedविधि:

drawer.closeDrawer(GravityCompat.END);

और आपकी गतिविधि में_मैं। xml

<android.support.v4.widget.DrawerLayout 
   android:id="@+id/drawer_layout"
   tools:openDrawer="end">

   <android.support.design.widget.NavigationView
      android:id="@+id/nav_view"
      android:layout_gravity="end"/>
</android.support.v4.widget.DrawerLayout>

3

यहाँ दराज पर प्रलेखन है और यह प्रतीत होता है कि आप इसे बाईं या दाईं ओर से बाहर निकालने के लिए कॉन्फ़िगर कर सकते हैं।

दराज की स्थिति और लेआउट को एंड्रॉइड का उपयोग करके नियंत्रित किया जाता है: लेआउट_ग्रेविटी विशेषता बच्चे के विचारों पर इसी दृष्टिकोण के अनुसार कि आप ड्रॉअर को किस तरफ से उभरना चाहते हैं: बाएं या दाएं। (या लेआउट दिशा का समर्थन करने वाले प्लेटफ़ॉर्म संस्करणों पर प्रारंभ / समाप्ति।)

http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html


मैंने इस उत्तर को पहले देखा, और मैंने अपने प्रश्न में इसका उल्लेख भी किया।
गैल्वेन

ठीक है। गुरुत्वाकर्षण के endबजाय का उपयोग करने का प्रयास करें right। संपादित करें: निकालें android:layout_gravity="right"से android.support...DrawerLayoutपरिवर्तन और android:layout_gravity="right"करने के लिए android:layout_gravity="end"अंदरListView
Kickass

1
मुझे अभी भी त्रुटि मिली है: पूर्ण गुरुत्वाकर्षण LEFT के साथ कोई दराज दृश्य नहीं मिला। मैंने मैनिफ़ेस्ट एंड्रॉइड में जोड़ा: supportRtl = "true", और दराज में xLLayout के तहत मैंने android जोड़ा: लेआउटडायरेक्शन = "आरटीएल", और फिर मेनू दाईं ओर खुलता है, लेकिन अब यह बंद हो जाता है जब मैं ckick करता हूं मेनू बटन (एक्शन बार में) जब मैं सूची में किसी आइटम पर क्लिक करता हूं, या सूची से बाहर यह बंद हो जाता है, लेकिन नहीं जब मैं कार्रवाई बार में मेनू बटन पर क्लिक करता हूं, तो कोई विचार क्यों?
गैल्वेन

मुझे पूरी तरह यकीन नहीं है, लेकिन ... जैसा कि दराज की दिशा और स्थिति अब बदल गई है, आपकी गतिविधि में, एंड्रॉइड उदाहरण के अनुसार, आपके पास टॉगल स्विच विधि / बटन श्रोता होना चाहिए, जांचें कि क्या होना चाहिए संशोधित किया गया है ताकि यह राइटटॉलेट को स्थानांतरित करके बंद करना जानता है। यह सोच रहा होगा कि मेनू पर पकड़ पहले से ही वाम (यानी छिपी हुई) है, इसलिए यह पास नहीं होगा (अगर इसका कोई मतलब है) ...
KickAss

दोस्तों, मैं भी एक ही तरह का काम कर रहा हूँ, लेकिन अगर laoutDirection = "rtl" का उपयोग करते हैं, तो मुझे 17 के रूप में minSdk को बदलना होगा, लेकिन मेरे ऐप को API स्तर 10 का समर्थन करने की आवश्यकता है। क्या आप लोग मेरी मदद कर सकते हैं ताकि मेरा ऐप 10 का समर्थन कर सके।
आदित्य

3

इस पर एक नज़र डालें: दायीं ओर बायीं ओर विस्तृत विस्तारवादी स्लाइड स्लाइड करें

मुझे लगता है कि आपके पास ActionBarDrawerToggle कार्यान्वित किया गया है, onOptionsItemSelected(MenuItem item)इस के साथ ActionBarDrawerToggle ऑब्जेक्ट के अंदर विधि को ओवरराइड करना है :

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item != null && item.getItemId() == android.R.id.home) {
            if (mDrawer.isDrawerOpen(Gravity.RIGHT)) {
                mDrawer.closeDrawer(Gravity.RIGHT);
            } else {
                mDrawer.openDrawer(Gravity.RIGHT);
            }
            return true;
        }
        return false;
    }

यह सुनिश्चित करें और onOptionsItemSelected(MenuItem item)गतिविधि में इसे कॉल करें :

@Override
public boolean onOptionsItemSelected(MenuItem item) {

if(mDrawerToggle.onOptionsItemSelected(item)) {
    return true;
}

return super.onOptionsItemSelected(item);
}

यह आपको होम बटन की कार्यक्षमता का उपयोग करने की अनुमति देगा। बटन को एक्शन बार के दाईं ओर ले जाने के लिए आपको एक कस्टम एक्शन आइटम को लागू करना होगा, और हो सकता है कि इसे प्राप्त करने के लिए कुछ अन्य सामान जैसे आप चाहें।


3

निम्नलिखित त्रुटि के साथ मुख्य मुद्दा:

पूर्ण गुरुत्वाकर्षण के साथ कोई दराज दृश्य नहीं मिला

वह है, आपने परिभाषित किया है

android:layout_gravity="right"

दाईं ओर सूची-दृश्य के लिए, लेकिन इस फ़ंक्शन को कॉल करके बाईं ओर से दराज को खोलने का प्रयास करें:

mDrawerToggle.syncState();

और हैमबर्गर आइकन पर क्लिक करें!

बस उपरोक्त फ़ंक्शन पर टिप्पणी करें और @Rudi जैसे मेनू के खुले / बंद को संभालने का प्रयास करें!


3

मैंने नेविगेशन की गंभीरता को बदलकर इस समस्या को हल किया है

एंड्रॉयड: layout_gravity

करने के लिए खत्म करने के बजाय शुरुआत

<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header"
        app:menu="@menu/activity_drawer" />

इसने मेरे लिए काम किया।


2

आपको सबसे पहले इस कोड को एप्लिकेशन टैग में अपने AppManifest.xml में डालना चाहिए:

android:supportsRtl="true"

फिर अपनी activity_main.xml फ़ाइल में, इस कोड को डालें:

android:layout_direction="rtl"

यह अब तक का सबसे अच्छा उपाय है, आप मेरा दिन बचाएं धन्यवाद
अहमद मौसा

2

मैंने एंड्रॉइड स्टूडियो में नेविगेशन ड्रॉअर गतिविधि उदाहरण में संशोधन किया। समर्थन पुस्तकालयों के साथ 25.3.1।

MainActivity.java:

private DrawerLayout mDrawerLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
    if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) {
        mDrawerLayout.closeDrawer(GravityCompat.END);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int itemId = item.getItemId();
    switch (itemId) {
        case android.R.id.home:
            finish();
            return true;

        case R.id.action_right_drawer:
            if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) {
                mDrawerLayout.closeDrawer(GravityCompat.END);
            } else {
                mDrawerLayout.openDrawer(GravityCompat.END);
            }
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.

    mDrawerLayout.closeDrawer(GravityCompat.END);
    return true;
}

main.xml ( https://material.io/icons/ से ic_menu_white_24px डाउनलोड करें ):

<?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_right_drawer"
        android:title="Drawer menu"
        android:icon="@drawable/ic_menu_white_24px"
        android:orderInCategory="100"
        app:showAsAction="always" />
</menu>

Activity_main.xml परिवर्तन में

android:layout_gravity="start"

सेवा

android:layout_gravity="end"

2

इसे rtl से खोलना यूजर एक्सपीरियंस के लिए अच्छा नहीं है, इसे यूजर लोकल के प्रति रिस्पॉन्सिबल बनाने के लिए मैंने सिर्फ अपने ड्रॉअरआउट पैरामीटर में निम्न लाइन जोड़ी है:

android:layoutDirection="locale"

हैम्बर्गर लेआउट को ड्रॉअर ओपनिंग दिशा से भी मिलान करने के लिए इसे मेरे AppBarLayout में जोड़ा गया।


1

दराज के गुण android:layout_gravity="right|end"और tools:openDrawer="end" नेविगेशन दृश्य संपत्ति android:layout_gravity="end"

XML Layout

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:layout_gravity="right|end"
    tools:openDrawer="end">

    <include layout="@layout/content_main" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</androidx.drawerlayout.widget.DrawerLayout>

Java Code

// Appropriate Click Event or Menu Item Click Event

if (drawerLayout.isDrawerOpen(GravityCompat.END)) 
{
     drawerLayout.closeDrawer(GravityCompat.END);
} 
else 
{
     drawerLayout.openDrawer(GravityCompat.END);
}
//With Toolbar
toolbar = (Toolbar) findViewById(R.id.toolbar);

drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();

toolbar.setNavigationOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //Gravity.END or Gravity.RIGHT
            if (drawer.isDrawerOpen(Gravity.END)) {
                drawer.closeDrawer(Gravity.END);
            } else {
                drawer.openDrawer(Gravity.END);
            }
        }
    });
//...
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.