कैसे नेविगेशन दृश्य में पाद लेख जोड़ने के लिए - Android समर्थन डिजाइन पुस्तकालय?


122

मैं पाद सेटिंग और प्रोफ़ाइल आइटम कैसे सेट कर सकता हूं NavitationView? ईमेल नेविगेशन दराज द्वारा इनबॉक्स की तरह लग रहा है। NavitationViewआइटम मेनू संसाधन द्वारा फुलाया जाता है, लेकिन मैं एक मेनू संसाधन करने के लिए नीचे आइटम स्थापित करने के लिए कैसे, या कैसे मैं करने के लिए एक कस्टम दृश्य सेट कर सकते हैं पता नहीं है NavigationViewया एक नीचे ऑफसेट? मैंने इसे <LinearLayout...>पाद दृश्य के रूप में रखने की कोशिश की है , लेकिन छोटे स्क्रीन पर पाद लेख आइटम डालता है और मैं मेनू को स्क्रॉल कर सकता हूं, मैंने पाद लेख पैडिंग सेट करने का प्रयास किया है NavigationView, लेकिन पाद लेख भी पैडिंग लेता है।

यह छोटे स्क्रीन पर स्क्रॉल नहीं कर रहा है:

<android.support.design.widget.NavigationView
    android:id="@+id/drawer"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/kuona_drawer_header"
    app:menu="@menu/drawer">

    <LinearLayout...>

</android.support.design.widget.NavigationView>

स्कोरिंग नहीं

यह स्क्रॉल करता है, लेकिन मेनू आइटम पर इसका पाद लेख:

<android.support.design.widget.NavigationView
    android:id="@+id/drawer"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:paddingBottom="96dp"
    app:headerLayout="@layout/kuona_drawer_header"
    app:menu="@menu/drawer">

    <LinearLayout...>

</android.support.design.widget.NavigationView>

यहाँ छवि विवरण दर्ज करें

दराज मेनू res/menu/drawer.xmlफ़ाइल:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/action_current_list"
            android:checked="true"
            android:icon="@drawable/ic_current_list"
            android:title="@string/current_list" />
        <item
            android:id="@+id/action_manage_lists"
            android:icon="@drawable/ic_my_lists"
            android:title="@string/my_lists" />
        <item
            android:id="@+id/action_search_products"
            android:icon="@drawable/ic_search_black_24dp"
            android:title="@string/search_products" />
        <item
            android:id="@+id/action_deals"
            android:icon="@drawable/ic_product_promo"
            android:title="@string/deals" />
    </group>
</menu>

किस स्थान पर आपने @ मेनू / दराज फ़ाइल
रखी है

यह/res/menu/drawer.xml
epool

क्या कोई कारण है जो आप "फीडबैक" और "साइन आउट" मेनू आइटम के रूप में नहीं कर सकते हैं? यदि कारण यह है कि आप "साइन आउट" के लिए मेनू आइकन को गतिशील रूप से बदलना चाहते हैं, तो आपको ऐसा करने में सक्षम होना चाहिए menuItem.setIcon(Drawable)
भुखमरी

यह केवल आवश्यकताओं के लिए है, और व्यक्तिगत रूप से मैं जानना चाहता हूं कि Google उदाहरण के लिए इनबॉक्स ऐप को कैसे करता है।

यह सवाल 23.1 अपडेट के साथ और भी महत्वपूर्ण हो जाता है
एलेक्स सोरोकोलेटोव

जवाबों:


151

यदि आप अपने नेविगेशन मेनू में फिक्स्ड (नॉन-स्क्रॉलिंग) फूटर चाहते हैं, तो आपको किसी अन्य लेआउट के चारों ओर नेविगेशन व्यू की आवश्यकता होती है, जैसे आपने पोस्ट किया है। नेवीगेशन व्यू फ्रेमलैट की तरह काम करता है, इसलिए यह नेविगेशन व्यू मेनू आइटम के शीर्ष पर आंतरिक लेआउट को "स्टैकिंग" करता है। यहाँ यह व्यवस्था करने के लिए एक तरीका है, पाद लेख के लिए रेखीय लउटआउट का उपयोग करना:

निश्चित पाद

<android.support.design.widget.NavigationView
    android:id="@+id/drawer"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/drawer_header"
    app:menu="@menu/drawer">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:clickable="true"
        android:orientation="vertical">
        <TextView
            android:id="@+id/footer_item_1"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:gravity="center"
            android:text="Footer Item 1" />
        <TextView
            android:id="@+id/footer_item_2"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:gravity="center"
            android:text="Footer Item 2" />
    </LinearLayout>

</android.support.design.widget.NavigationView>

मैंने इस उदाहरण में TextViews का उपयोग किया, लेकिन आप पाद लेख के दृश्य के लिए जो चाहें उपयोग कर सकते हैं। मेनू के निचले भाग के साथ अतिव्यापी आइटम से बचने के लिए, अपने मेनू संसाधन फ़ाइल के अंत में कुछ डमी आइटम जोड़ें (ये "स्पेसर्स" की तरह काम करेंगे):

रेस / मेनू / drawer.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group>
        <item
            android:id="@+id/nav_item_1"
            android:icon="@drawable/ic_nav_item_1"
            android:title="Nav Item 1" />
        <item
            android:id="@+id/nav_item_2"
            android:icon="@drawable/ic_nav_item_2"
            android:title="Nav Item 2" />
        <item
            android:id="@+id/nav_item_3"
            android:icon="@drawable/ic_nav_item_3"
            android:title="Nav Item 3" />
        <item
            android:id="@+id/nav_item_4"
            android:icon="@drawable/ic_nav_item_4"
            android:title="Nav Item 4" />
        <item
            android:id="@+id/footer_spacer_1"
            android:checkable="false"
            android:enabled="false"
            android:orderInCategory="200"
            android:title="" />
        <item
            android:id="@+id/footer_spacer_2"
            android:checkable="false"
            android:enabled="false"
            android:orderInCategory="200"
            android:title="" />
    </group>
</menu>

अंत में, वास्तविक पाद लेख विचारों के लिए अपनी गतिविधि में क्लिक श्रोताओं को जोड़ना न भूलें:

...
// Click listener for nav footer.
View navFooter1 = findViewById(R.id.footer_item_1);
navFooter1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do footer action
    }
});
View navFooter2 = findViewById(R.id.footer_item_2);
navFooter2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do footer action
    }
});
...

स्क्रॉलिंग पाद

यदि आप पाद लेख को बाकी नेविगेशन दृश्य के साथ स्क्रॉल करने की अनुमति देते हैं, तो यह चीजों को सरल बनाता है (कोई अतिरिक्त लेआउट या श्रोताओं पर क्लिक न करें)। बस अपने मेनू संसाधन फ़ाइल में पाद लेख आइटम को एक अद्वितीय के रूप में जोड़ें <group>(यह एक विभाजक रेखा बनाएगा ), और सब कुछ स्वचालित रूप से संभाला जाएगा और एक साथ स्क्रॉल किया जाएगा:

रेस / मेनू / drawer.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/nav_menu">
        <item
            android:id="@+id/nav_item_1"
            android:icon="@drawable/ic_nav_item_1"
            android:title="Nav Item 1" />
        <item
            android:id="@+id/nav_item_2"
            android:icon="@drawable/ic_nav_item_2"
            android:title="Nav Item 2" />
        <item
            android:id="@+id/nav_item_3"
            android:icon="@drawable/ic_nav_item_3"
            android:title="Nav Item 3" />
        <item
            android:id="@+id/nav_item_4"
            android:icon="@drawable/ic_nav_item_4"
            android:title="Nav Item 4" />
    </group>
    <group android:id="@+id/nav_footer">
        <item
            android:id="@+id/nav_footer_1"
            android:icon="@drawable/ic_footer_item_1"
            android:title="Footer Item 1" />
        <item
            android:id="@+id/nav_footer_2"
            android:icon="@drawable/ic_footer_item_2"
            android:title="Footer Item 2" />
    </group>
</menu>

1
यह केवल आवश्यकताओं के लिए है, और व्यक्तिगत रूप से मैं जानना चाहता हूं कि Google उदाहरण के लिए इनबॉक्स ऐप को कैसे करता है।

मुझे यकीन नहीं है कि Google इसे gmail ऐप में कैसे करता है, लेकिन दिखावे से, यह वैसा ही दिखता है जैसा मैंने उत्तर में बताया है। <group> यदि आप एक विभाजक रेखा चाहते हैं तो एक अलग का उपयोग करें , अन्यथा, जीमेल ऐप का नव पाद लेख सामान्य मेनू आइटम (कम से कम मेरे लिए) जैसा दिखता है।
भुखमरी

1
आह, मैं अब समझ गया। मुझे लगा कि आप gmail ऐप के बारे में बात कर रहे हैं। मैंने इनबॉक्स ऐप इंस्टॉल नहीं किया है, लेकिन यदि आप एक स्थिर पाद की तलाश कर रहे हैं, तो आप सही हैं, आपको एक अलग लेआउट का उपयोग करना होगा। हालांकि यह बहुत मुश्किल नहीं होना चाहिए। आइए देखते हैं ...
Hungghost

7
आप उपयोग कर सकते हैं <dimen name="design_navigation_padding_bottom" tools:override="true">48dp</dimen> में dimen.xmlबजाय मेनू में डमी आइटम का उपयोग करने का! यह एकदम सही है !
ओमिड

1
मैं पाद लेख टेक्स्टव्यू के लिए दराज के आइटम का फ़ॉन्ट और फ़ॉन्ट आकार कैसे सेट कर सकता हूं?
JEGADEESAN S

37

मैं आपको केवल यह संकेत दूंगा कि इसे कैसे हल किया जाए, लेकिन मुझे नेविगेशन व्यू पर इसका परीक्षण करने का कोई मौका नहीं मिला है, और मुझे पूरा यकीन है कि यह काम करेगा

यहाँ नमूना लेआउट xml;

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:clipToPadding="false"
  android:paddingBottom="96dp">

  <TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#6F00" />

  <TextView
    android:layout_width="match_parent"
    android:layout_height="96dp"
    android:layout_gravity="bottom"
    android:layout_marginBottom="-96dp"
    android:background="#600F" />

</FrameLayout>

यहाँ परिणाम है:

यहाँ छवि विवरण दर्ज करें

चाल बच्चे को माता-पिता और माइनस मार्जिन पर पैडिंग लगाने से है।


त्वरित प्रयास:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.NavigationView xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_gravity="start"
  android:clipToPadding="false"
  android:paddingBottom="96dp"
  app:headerLayout="@layout/sample_header"
  app:menu="@menu/sample_menu">


  <TextView
    android:layout_width="match_parent"
    android:layout_height="96dp"
    android:layout_gravity="bottom"
    android:layout_marginBottom="-96dp"
    android:background="#600F"
    android:gravity="center"
    android:text="I STAND BY MY SELF" />

</android.support.design.widget.NavigationView>

यहाँ छवि विवरण दर्ज करें


3
यह काम कर सकता है, लेकिन नकारात्मक मार्जिन बहुत अधिक है। इसलिए, व्यक्तिगत रूप से, यदि संभव हो तो मैं उनसे बचता हूं।
भुखमरी

यह पाद लेख, यदि आप नीचे दिए गए आइकन "बॉटम" को लगाते हैं, तो आप स्क्रीन के आधार पर बदल सकते हैं और कट जाएगा इस पोस्ट को देखें stackoverflow.com/questions/32460312/…
del '10

क्या आप पूर्ण उदाहरण के बारे में कोई लिंक प्रदान कर सकते हैं?
delive

क्या हम इसे स्क्रॉल करने के लिए सेट कर सकते हैं?
अहमद शाहविज़

27

नेस्टिंग नेविगेशन विचारों के अन्य उत्तरों में वर्णित दृष्टिकोणों के बाद, कुछ समस्याएं सामने आईं:

  • कई मदों के साथ, या लैंडस्केप मोड पर, पाद लेख मेनू आइटम के साथ ओवरलैप किया गया
  • यदि वास्तविक मेनू में बहुत अधिक आइटम हैं, तो नेस्टेड नेवीगेशन व्यू स्क्रॉल करने योग्य मिला, जो अच्छा नहीं लग रहा था
  • नेस्टिंग में दो नेवीगेशन व्यूज होने के कारण कस्टम दृश्य को पाद लेख के रूप में परिभाषित करने की अनुमति नहीं दी।
  • नेस्टेड स्क्रॉलव्यू को हैंडल करना एक गड़बड़ था (कभी-कभी दो स्क्रॉलबार दिखाए गए आदि)
  • निश्चित पाद हमेशा नीचे की ओर होना चाहिए (कुछ के साथ-साथ कई मेनू आइटम के साथ)

इन सभी समस्याओं के लिए मेरा समाधान निम्नलिखित था:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout ...>

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

    <android.support.design.widget.NavigationView ...>

        <android.support.v4.widget.NestedScrollView
            ...
            android:fillViewport="true"
            android:scrollbars="vertical">

            <LinearLayout
                ...
                android:orientation="vertical">

                <android.support.design.widget.NavigationView
                    ...
                    app:elevation="0dp"
                    app:headerLayout="@layout/nav_header"
                    app:menu="@menu/nav_menu">
                </android.support.design.widget.NavigationView>

                <LinearLayout
                    android:id="@+id/spacer_to_bottom"
                    ...
                    android:layout_height="0dp"
                    android:layout_weight="1">
                </LinearLayout>

                <include layout="@layout/nav_footer"></include>
            </LinearLayout>
        </android.support.v4.widget.NestedScrollView>
    </android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

यहाँ, NestedScrollView उप-नेविगेशन दृश्य के लिए स्क्रॉलिंग अभिभावक के रूप में कार्य करता है। इसका मतलब है कि उप-नेविगेशनव्यू कभी भी स्क्रॉलबार को नहीं दिखाता है, लेकिन पूरी सामग्री को सपाट तरीके से दिखाया गया है।

लेआउट 'स्पेसर_टो_बॉटम' शेष सभी स्थान को भर देता है, ताकि कुछ मेनू आइकन के साथ, पाद लेख नीचे की ओर रहे।

अंत में, निश्चित पाद लेख को रैखिक लेआउट में जोड़ा जाता है, जो वास्तविक मेनू (उप-नेविगेशन दृश्य), स्पेसर के साथ शुरू होता है, और नीचे पाद लेख होता है।

यहाँ आपको AndroidStudio-Project के रूप में पूरा कार्य करने वाला उदाहरण मिल सकता है: https://github.com/MarcDahlem/AndroidSidemenuFooterExample

विशेष रूप से नेविगेशन ड्रॉअर यहाँ पाया जा सकता है: https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity/main.xml

स्क्रीनशॉट:

कुछ आइटम कई आइटम


वास्तव में क्या काम नहीं कर रहा है? यदि आवश्यक हो तो मैं एक उदाहरण परियोजना प्रदान कर सकता हूं, जो स्क्रॉलिंग पाद के साथ बहुत अच्छा काम करता है। @AndreaBaccega
Adreamus

मैं @AndreaBaccega से सहमत हूं, काम नहीं कर रहा, केवल
नेवी

ठीक है, समस्याओं के साथ दूसरा। मैं एक उदाहरण परियोजना बनाऊंगा और इसे जीथूब पर अपलोड करूंगा। cu जल्द ही
Adreamus

मैंने github पर एक उदाहरण प्रोजेक्ट जोड़ा: github.com/MarcDahlem/AndroidSidemenuFooterExample
Adreamus

उत्थान विशेषता के लिए बड़ा उत्थान। मैं उसी दृष्टिकोण के साथ जा रहा था, लेकिन नीचे की छाया से छुटकारा नहीं पा सका। फिर, मैंने यह पाया। धन्यवाद!
एल्वेडिन सेलिमोस्की

23

इसका सबसे सरल उत्तर है कि ड्रॉअर लेआउट के अंदर एक बटन जोड़ना और उसमें नीचे की ओर गुरुत्वाकर्षण सेट करना navigationview.xml

यहाँ कोड है:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.NavigationView
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:id="@+id/navigation"
   android:layout_width="200dp"
   android:layout_height="match_parent"
   android:layout_gravity="start"
   app:headerLayout="@layout/navigation_header"
   app:menu="@menu/menu_navigation">

     <Button
            android:id="@+id/btn_sing_in"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:text="@string/sign_in"
            android:layout_gravity="bottom"/>

</android.support.design.widget.NavigationView>

यहाँ परिणाम है


2
कुछ मेनू आइटम के लिए, यह काम कर सकता है। लेकिन जैसे ही आपके पास कई मेनू आइटम होंगे, बटन छोटे उपकरणों पर या लैंडस्केप मोड में मेनू आइटम के साथ ओवरलैप हो जाएगा।
एड्रैयसस

1
हालांकि, इसे दूर करने के लिए आप खाली मेनू आइटम रख सकते हैं।
मोहम्मद फदल

विभिन्न स्क्रीन के लिए खाली मेनू आइटम के साथ नीचे आवंटित करना लगभग संभव है। लेकिन ऐसा करने का एक सामान्य तरीका है जैसा कि मैंने अपने समाधान में वर्णित किया ;-) -> मेरा समाधान देखें stackoverflow.com/a/37714353/1075072
एड्रैसस

17

आपके पास एक कंटेनर नेविगेशन दृश्य लेआउट होना चाहिए और फिर इसमें दो और नेविगेशन लेआउट होने चाहिए। आप पैरेंट लेआउट के ऊपर और नीचे को संरेखित करते हैं।

मैं माता-पिता के रूप में एक नेविगेशन दृश्य का उपयोग करने की सलाह दूंगा और फ़्रेमलेयआउट नहीं, क्योंकि यह अनिवार्य रूप से एक स्क्रिमफ्रेमलेयआउट है और स्टेटस बार के साथ बेहतर तरीके से इंटरैक्ट करता है।

यहां एक उदाहरण दिया गया है कि आपकी गतिविधि कैसी दिखनी चाहिए:

<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/layout_dashboard"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">

<!-- Activity content goes here -->

<android.support.design.widget.NavigationView
    android:id="@+id/navigation_drawer_container"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start">

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_drawer"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="top"
        app:menu="@menu/menu_navigation_drawer" />

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_drawer_bottom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        app:menu="@menu/menu_navigation_drawer_bottom" />

</android.support.design.widget.NavigationView>

आप इसके बारे में अधिक पढ़ सकते हैं और यहां एक उदाहरण देख सकते हैं: http://blog.nitish.io/post/122633295558/android-design-library-navigationview-with-top


1
यह वास्तव में एक अच्छा समाधान है। लेकिन रैप कंटेंट टॉप एंड बॉटम दोनों पर काम नहीं कर रहा है। आपको नीचे की ओर नेवीगेशन व्यू ब्लॉक टॉप नेविगेशन व्यू को रोकने के लिए कुछ निरंतर ऊंचाई देनी होगी।
ऑल्के एर्टस

सही समाधान
Bolein95

@ नीट से कैसे बचें जब ओवरलैप से बचने के लिए पोर्ट्रेट मोड में "@ आईडी / नेविगेशन_ट्रैटर" अधिक होता है। यह नीचे नेविगेशन दृश्य के पीछे चला गया। मेरे मामले में शीर्ष नवावी मेनू आइटम गतिशील रूप से आबादी वाले हैं, नीचे के नवाब में स्थैतिक मेनू मान हैं।
मोहनराज एस

14

मुझे इसका देर से जवाब पता है, लेकिन इसका सही और सटीक जवाब है, जिसकी तलाश अधिकांश डेवलपर्स कर रहे हैं।

नेविगेशन दृश्य में पाद लेख जोड़ने के लिए, नीचे की तरह नेविगेशन मेनू में कस्टम दृश्य जोड़ें:

footer_navigation_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="@string/version" />

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:gravity="right" />

</RelativeLayout>

अब, समूह विशेषता के साथ अपने मेनू xml में उपरोक्त दृश्य जोड़ें। इसके अलावा, यह मेनू में पाद लेख के रूप में अंतर कर सकता है।

profile_menu.xml

<group android:checkableBehavior="single">

    <item
        android:id="@+id/nav_support"
        android:title="@string/nav_item_support" />

    <item
        android:id="@+id/nav_settings"
        android:title="@string/nav_item_settings" />

    <item
        android:id="@+id/nav_log_out"
        android:title="@string/nav_item_log_out" />
</group>
<group
    android:id="@+id/nav_footer">
    <item
        android:id="@+id/nav_log_version"
        app:actionLayout="@layout/footer_navigation_menu" />
</group>

बस। नीचे उत्पादन है:

यहाँ छवि विवरण दर्ज करें


यह जटिल तल दृश्य के मामले में काम नहीं करेगा क्योंकि यह नीचे के दृश्य को निश्चित ऊँचाई देता है।
आकाश बिसरिया

यह काम कर सकता है, लेकिन पाद लेख लेआउट के अंदर के विचारों पर onClickListeners सेट करने का कोई तरीका नहीं है ... मेरे मामले में मेरे पास बाहरी यूआरएल पर भेजने वाले पाद लेख पर सोशल मीडिया बटन हैं, लेकिन किसी भी तरह से अपनी आईडी का उपयोग करके विचार प्राप्त नहीं कर सकते हैं। मैं सोच सकता था ...
रामिरो जीएम

12

इसका एक प्रकार का बमर जो कि नेविगेशन व्यू में पाद लेख जोड़ने का प्रावधान नहीं है। लेकिन आप कुछ इस तरह की कोशिश कर सकते हैं,

<?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="start">

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

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view_container"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:fitsSystemWindows="false"
        android:layout_gravity="start"
        >

        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scrollbarAlwaysDrawVerticalTrack="true"
            android:scrollbars="vertical"
            android:isScrollContainer="true"
            app:headerLayout="@layout/nav_header_base"
            app:menu="@menu/activity_base_drawer"
            android:layout_gravity="top"
            android:layout_marginBottom="x"
            />

        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view_footer"
            android:layout_width="wrap_content"
            android:layout_height="x"
            app:headerLayout="@layout/hear_layout"
            app:menu="@menu/menu_items"
            android:scrollbars="none"
            android:layout_gravity="bottom"
            />

    </android.support.design.widget.NavigationView>

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

यदि आपका पाद लेख एक सूची है,

    app:headerLayout="@null"
    app:menu="@menu/activity_base_drawer_footer"

लेकिन, अगर यह किसी तरह का रिवाज है,

    app:headerLayout="@layout/my_cutom_footer_view"
    app:menu="@null"

इसके अलावा, इस मामले में, आपको सेट करने की आवश्यकता होगी x = height of your custom footer view

आशा करता हूँ की ये काम करेगा।


धन्यवाद भाई। आपने मेरा दिन बना दिया .. :)
सिद्धार्थ

3
3 नेविगेशन दृश्य? क्यों? सबसे खराब प्रदर्शन के लिए? कृपया, इनमें से कुछ वीडियो देखें: youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
Louis CAD

@LouisCAD यदि आपके पास एक समाधान है जो वास्तव में नकारात्मक मार्जिन के बिना काम करता है, तो कृपया इसे हमारे साथ साझा करें। मुझे यहां बताई गई समस्या है, और यह एकमात्र समाधान है जिसे मैं ध्यान में रखता हूं। शायद सही समाधान नहीं है, और कुछ प्रदर्शन प्रभाव पड़ सकता है ... लेकिन अन्य कार्यान्वयन के बिना, केवल प्रदर्शन मामलों के बारे में टिप्पणी न करें। सबसे पहले, एप्लिकेशन की आवश्यकताएं मायने रखती हैं। यदि Google आपकी एप्लिकेशन आवश्यकताओं के लिए समाधान प्रदान नहीं करता है ... तो आपके पास कई विकल्प नहीं हैं।
डस्केल्सस्कु वडुत

10

यहाँ छवि विवरण दर्ज करेंमैंने निम्नलिखित तरीके से एक ही चीज़ बनाई:

 <?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="start">

    <include
        layout="@layout/app_bar_main"
        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="start"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"
        >

        <LinearLayout android:layout_gravity="bottom"
            android:background="#20191d1e"
            android:layout_width="match_parent"
            android:paddingBottom="2dp"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="2dp"
            android:orientation="horizontal"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/company_image_id"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_margin="@dimen/margin1dp"
                android:padding="@dimen/margin2dp"
                android:src="@mipmap/ic_launcher_round"
                />

            <TextView
                android:id="@+id/txtCompanyName"
                android:layout_width="match_parent"                              android:layout_marginLeft="@dimen/margin3dp"
                android:layout_height="wrap_content"
                android:textSize="13dp" android:layout_gravity="center"
                android:textStyle="bold"
                android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
        </LinearLayout>
    </android.support.design.widget.NavigationView>

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

यहाँ मुख्य बात यह है कि मैंने लेआउट गुरुत्वाकर्षण को नीचे की ओर रखा है उदा

LinearLayout android:layout_gravity="bottom"

इस समाधान के साथ नीचे का दृश्य मेनू आइटम (यदि कई मेनू आइटम हैं) पर तैरने लगेगा ... लेकिन मैं चाहता हूं कि यह नीचे में तय हो।
आकाश बिसरिया

7

आपके दृष्टिकोण के बाद, कुछ मामूली बदलावों से आपको जो हासिल करना है उसमें मदद मिल सकती है।

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:background="@color/background_material_light">
    <TextView
       android:id="@+id/footer_item"
       android:layout_width="match_parent"
       android:layout_height="?attr/listPreferredItemHeight"
       android:background="?attr/selectableItemBackground"
       android:gravity="center_vertical"
       android:paddingLeft="?attr/listPreferredItemPaddingLeft"
       android:text="Something"
       android:textAppearance="?attr/textAppearanceListItem" />
</LinearLayout>

और मेनू में कुछ स्टब आइटम सेट करें, ताकि मेनू आइटम ओवरलैप न हों।

<group>
    ...
    <item
        android:title=""
        android:orderInCategory="200"/>
</group>

इसके अलावा, आप अपने पाद लेख आइटम पर एक क्लिक श्रोता जोड़ना चाहते हैं।


आपके उत्तर के लिए धन्यवाद, इसने मुझे अपने पाद लेख को जोड़ने के लिए एक वर्कअराउंड दिया, लेकिन मुझे आशा है कि आपका उत्तर मुझे स्वीकार होगा यदि कोई मुझे बेहतर करने के लिए बेहतर उत्तर नहीं देता है। +1
एपील

अपने विकल्पों को वास्तव में खुला रखें। बेहतर जवाब के लिए भी देख रहे हैं क्योंकि पाद महत्वपूर्ण हैं।
1

6

फिक्स्ड फूटर और स्क्रॉल मेनू के साथ मेरा समाधान (100% परीक्षण)

 <android.support.design.widget.NavigationView
    android:id="@+id/container_navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity=""
    android:nestedScrollingEnabled="true"
    android:scrollIndicators="none">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.NavigationView
            android:id="@+id/navigation"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_above="@+id/navigation2"
            android:layout_gravity="top"
            android:nestedScrollingEnabled="true"
            android:paddingBottom="@dimen/dimen_20_dp"
            app:headerLayout="@layout/nav_header"
            app:itemIconTint="@color/black_800"
            app:itemTextColor="@color/black_800"
            app:menu="@menu/navigation_drawer_items">

        </android.support.design.widget.NavigationView>

        <android.support.design.widget.NavigationView
            android:id="@+id/navigation2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:background="@color/white_100"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/empty_spacer"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:drawableTop="@drawable/ic_search"
                    android:gravity="center"
                    android:text="Share" />

                <TextView
                    android:id="@+id/mnuRate"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:drawableTop="@drawable/ic_search"
                    android:gravity="center"
                    android:text="Rate" />

                <TextView
                    android:id="@+id/mnuHelp"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:drawableTop="@drawable/ic_search"
                    android:gravity="center"
                    android:text="Help" />
            </LinearLayout>
        </android.support.design.widget.NavigationView>

    </RelativeLayout>

</android.support.design.widget.NavigationView>

6

यह है कि मैं नेविगेशन के नीचे लेआउट जोड़ने के लिए कैसे प्राप्त करूं:

अद्यतित पुस्तकालय

    <com.google.android.material.navigation.NavigationView
    android:id="@+id/navigation_drawer_container"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start">

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

                <com.google.android.material.navigation.NavigationView
                    android:id="@+id/nav_view"
                    android:layout_width="wrap_content"
                    android:layout_height="0dp"
                    android:layout_gravity="top"
                    android:layout_weight="0.8"
                    app:headerLayout="@layout/nav_header_home"
                    app:menu="@menu/activity_home_drawer" />

                <com.google.android.material.navigation.NavigationView
                    android:id="@+id/navigation_drawer_bottom"
                    android:layout_width="wrap_content"
                    android:layout_height="0dp"
                    android:layout_weight="0.2">

                    <LinearLayout
                        android:id="@+id/linearLayout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_alignParentBottom="true"
                        android:layout_below="@+id/scrollView"
                        android:orientation="vertical">

                        <TextView
                            android:id="@+id/text_dashboard_followUsAt"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:paddingLeft="16dp"
                            android:paddingStart="16dp"
                            android:text="Follow us at" />

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:orientation="horizontal"
                            android:paddingLeft="16dp"
                            android:paddingStart="16dp">

                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:padding="5dp"
                                android:src="@drawable/fb" />

                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:padding="5dp"
                                android:src="@drawable/fb" />

                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:padding="5dp"
                                android:src="@drawable/fb" />
                        </LinearLayout>

                        <TextView
                            android:id="@+id/text_dashboard_version"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="end"
                            android:layout_marginTop="25dp"
                            android:paddingBottom="5dp"
                            android:paddingEnd="16dp"
                            android:paddingRight="16dp"
                            android:text="Version 1.0" />
                    </LinearLayout>
                </com.google.android.material.navigation.NavigationView>
        </LinearLayout>
    </androidx.core.widget.NestedScrollView>
</com.google.android.material.navigation.NavigationView>

यह नेविगेशन व्यू के तल पर पाद लेआउट जोड़ने के लिए सही समाधान है। हालांकि एक रैखिक-लेआउट की आवश्यकता नहीं थी जो मैंने इस उत्तर में संपादित की है।
आकाश बिसरिया

आपने इस गतिविधि में नेविगेशन आइटम चयनित श्रोता को कैसे सेट किया? @zohaib khaliq
आकाश

5

NavigationViewपहला बच्चा ListViewहेडर और मेनू आइटम दोनों से युक्त है।

पाद लेख जोड़ने के लिए केवल एक चीज की आवश्यकता है .addFooterView को ListView में देखें

अधिक जानकारी: http://www.andreabaccega.com/blog/2015/08/28/how-to-add-footer-to-navigationview/

कॉपी पेस्ट कोड:

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ListView listView = (ListView) navigationView.getChildAt(0);
    View toRet = LayoutInflater.from(view.getContext()).inflate(R.layout.drawer_footer, listView, false);

    // Manipulate the view (if you need to) before calling addFooterView.

    listView.addFooterView(toRet, null, false);
  }

10
'com.android.support:design:23.1.0' पर काम नहीं किया। यह नेविगेशनमाइनेपर्सेंट में एक
पुनर्नवीनीकरण दृश्य

मैंने एक नया उत्तर जोड़ा जिससे आपकी समस्या हल हो सकती है।
लुकास

2

बस अपने नेविगेशन दृश्य के अंदर एक और लेआउट डालें:

<android.support.design.widget.NavigationView 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#000000"
        app:itemTextColor="#FFFFFF"
        app:headerLayout="@layout/fragment_side_menu_header"
        app:menu="@menu/side_menu">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="bottom">
        <TextView
            android:textColor="#FFFFFF"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="test" />
        <TextView
            android:textColor="#FFFFFF"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="test2" />
    </LinearLayout>
</android.support.design.widget.NavigationView>

ट्रिक में लेआउट_ग्रेविटी = "बॉटम" का उपयोग करना है - यह आपके पूरे लेआउट को सबसे नीचे रखेगा और टेस्ट, टेस्ट 2 ठीक से स्टैक्ड हो जाते हैं।


2

इसे इस्तेमाल करो..

<android.support.design.widget.NavigationView
    android:id="@+id/navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/nav_header"
    app:itemIconTint="@color/accent"
    app:itemTextColor="@color/primary_text"
    app:menu="@menu/navigation_drawer_items">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="@color/grey_200"
        android:orientation="vertical">

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/divider_height"
            android:background="@color/grey_600"/>

        <com.facebook.share.widget.LikeView
            android:id="@+id/like_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:padding="@dimen/small"/>

        <com.facebook.login.widget.LoginButton
            android:id="@+id/login_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/small"/>
    </LinearLayout>
</android.support.design.widget.NavigationView>

इसके बाद नेवीगेशन में नीचे पैडिंग सेट करें

final View menuView = navigationView.getChildAt(0);
final View bottomView = navigationView.getChildAt(1);
bottomView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            menuView.setPadding(0, 0, 0, bottomView.getMeasuredHeight());
        }
    });

2

यह कोशिश करो, यह काम मेरे लिए है।

<android.support.design.widget.NavigationView
                    android:id="@+id/nav_view1"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_gravity="start"
                    android:fitsSystemWindows="true">

                    <ScrollView
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent">

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:orientation="vertical">

                        <android.support.design.widget.NavigationView
                            android:layout_width="wrap_content"
                            android:layout_height="match_parent"
                            android:id="@+id/nav_view"
                            app:headerLayout="@layout/nav_header_admin"
                            app:menu="@menu/activity_admin_drawer"/>

                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:orientation="vertical"
                            android:id="@+id/lyNavFooter">

                           <!--INCLUDE YOUR FOOTER HERE -->

                        </LinearLayout>
                    </LinearLayout>

                    </ScrollView>



                </android.support.design.widget.NavigationView>

1

मैं इस फॉर्म का उपयोग करता हूं, मेरे लिए काम करता है। परिदृश्य और चित्र में।

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.NavigationView
            android:id="@+id/navigation"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            app:headerLayout="@layout/master_main_header"
            app:itemIconTint="@color/blue"
            app:menu="@menu/menu_drawer">

        </android.support.design.widget.NavigationView>

        <Button
            android:id="@+id/master_btn_closession"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:background="@color/blue"
            android:text="Cerrar sesión" />
    </LinearLayout>
</android.support.design.widget.NavigationView>

1

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

<android.support.design.widget.NavigationView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/activity_main_drawer">

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        android:scrollbars="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <android.support.design.widget.NavigationView
                android:id="@+id/nav_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:elevation="0dp"
                app:headerLayout="@layout/nav_header_main"
                app:menu="@menu/activity_main_drawer">
                ></android.support.design.widget.NavigationView>

            <LinearLayout
                android:id="@+id/spacer_to_bottom"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:orientation="vertical" />

        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_marginBottom="0dp">

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

    </LinearLayout>
</android.support.design.widget.NavigationView>


1
जवाब के साथ कुछ स्पष्टीकरण जोड़ें कि यह उत्तर ओपी को वर्तमान मुद्दे को ठीक करने में कैसे मदद करता है
ρяєρ withя K

2
मुझे समाधान मिल गया है। आपको पाद के लिए एक स्थिर लेआउट शामिल करना होगा, अंदर <android.support.design.widget.NavigationView>...</android.support.design.widget.NavigationView>। अधिक जानकारी के लिए कृपया github repocitory ( github.com/mehul0/AndroidSidemenuFooterExample-master )

1

यह मेरे लिए नेविगेशन ड्रावर (चित्र और लैंडस्केप ओरिएंटेशन) के पाद पर चित्र लगाने के लिए काम कर रहा है

    <?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="start">

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

            <android.support.design.widget.NavigationView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                android:background="#f00"
                android:fitsSystemWindows="true"
                app:menu="@menu/activity_main3_drawer">

                <android.support.v4.widget.NestedScrollView
                    android:layout_width="match_parent"
                    android:fillViewport="true"
                    android:layout_height="match_parent"
                    android:scrollbars="vertical">

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="vertical">

                        <android.support.design.widget.NavigationView
                            android:id="@+id/nav_view"
                            app:elevation="0dp"
                            android:layout_height="wrap_content"
                            android:layout_width="match_parent"
                                android:background="#ff0"
                            app:headerLayout="@layout/nav_header_main3"
                            app:menu="@menu/activity_main3_drawer">
                            ></android.support.design.widget.NavigationView>

                        <LinearLayout
                            android:id="@+id/spacer_to_bottom"
                            android:layout_width="match_parent"
                            android:orientation="vertical"
                            android:background="#0f0"
                            android:layout_height="0dp"
                            android:layout_weight="1">
                            <include layout="@layout/nav_footer_main3"></include>
                        </LinearLayout>


                    </LinearLayout>
                </android.support.v4.widget.NestedScrollView>
            </android.support.design.widget.NavigationView>

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

मेरी nav_footer_main3 है

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="60dp">
        <ImageView
            android:id="@+id/imageView"
            android:layout_gravity="center_horizontal"
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:background="@drawable/logo_1" />
    </LinearLayout>

1

दराज मेनू में चिपचिपा हेडर और पाद लेख के लिए लेआउट संरचना:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout>

    <android.support.design.widget.AppBarLayout>
        <android.support.v7.widget.Toolbar/>
    </android.support.design.widget.AppBarLayout>

    <LinearLayout>
        <include layout="@layout/drawer_header"/>
        <android.support.design.widget.NavigationView/>
        <include layout="@layout/drawer_footer"/>
    </LinearLayout>

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

पूरा लेआउट:

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:elevation="0dp">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" >
        </android.support.v7.widget.Toolbar>
    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:layout_gravity="start"
        android:orientation="vertical">
        <include layout="@layout/drawer_menu_header"/>

        <android.support.design.widget.NavigationView
            android:id="@+id/drawer_menu_body"
            app:elevation="0dp"
            android:layout_height="0dp"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:background="@color/white"
            android:theme="@style/AppTheme.PopupOverlay"
            app:menu="@menu/main_drawer">
        </android.support.design.widget.NavigationView>

        <include layout="@layout/drawer_menu_footer"/>
    </LinearLayout>

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

1

यह कोशिश करो, यह काम मेरे लिए है। https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml

हालाँकि, आप चिकनी स्क्रॉलिंग के लिए NavigationViewScrolling को अक्षम कर सकते हैं

private void disableNavigationViewScrolling(NavigationView navigationView) {
    if (navigationView != null) {
        NavigationMenuView navigationMenuView = (NavigationMenuView) navigationView.getChildAt(0);
        if (navigationMenuView != null) {
            navigationMenuView.setNestedScrollingEnabled(false);
        }
    }
}

स्क्रीनशॉट:


0

संस्करण> 23.xx के लिए स्क्रॉलिंग पाद

मैं आखिरकार वह हासिल करने में कामयाब रहा जो मैं चाहता था, दुर्भाग्य से ऐसा लगता है कि यह संभव नहीं है कि केवल लिस्ट व्यू के संदर्भ को पकड़ो और 23.xx के नीचे के संस्करणों के रूप में शीर्ष लेख और पाद लेख को जोड़ दें (जैसा कि एंड्रिया बेकेगा द्वारा वर्णित है)। हेडर के लिए ऐसा करना अभी भी संभव है:

     <android.support.design.widget.NavigationView
     ..
     app:headerLayout="@layout/item_drawer_footer"
     ..
     />

लेकिन फिलहाल पाद जोड़ना संभव नहीं है। हालाँकि, मैंने पाया कि आप केवल पाद लेख जोड़ने का प्रयास कर रहे हैं: यदि आप केवल दृश्य को उल्टा कर रहे हैं, तो यह शीर्ष लेख को नीचे जोड़ देगा जो एक सामान्य पाद लेख की तरह व्यवहार करता है। बस अपने मेनू को रिवर्स ऑर्डर में बनाना सुनिश्चित करें

    // Grab reference to the embedded recycler view
    RecyclerView mRecyclerView = (RecyclerView) navigationView.getChildAt(0);

    // Create a LinearLayoutManager and set it to reversed
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
    mLayoutManager.setReverseLayout(true);

    // Apply layout manager to the recycler view
    mRecyclerView.setLayoutManager(mLayoutManager);

0

फिक्स्ड हेडर और फुटर के लिए मेरा व्यक्तिगत समाधान निम्नलिखित के अनुसार नेवीगेशन व्यू का विस्तार कर रहा है:

/**
 * Created by guness on 17.01.2018.
 */
class NavigationView : android.support.design.widget.NavigationView {

private var mHeader: View? = null
private var mFooter: View? = null
private var mMenuView: NavigationMenuView? = null

constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
    val a = TintTypedArray.obtainStyledAttributes(context, attrs,
            R.styleable.NavigationView, defStyleAttr,
            R.style.Widget_Design_NavigationView)

    if (a.hasValue(R.styleable.NavigationView_footerLayout)) {
        inflateFooterView(a.getResourceId(R.styleable.NavigationView_footerLayout, 0))
    }

    a.recycle()

    (mFooter?.layoutParams as FrameLayout.LayoutParams?)?.gravity = Gravity.BOTTOM
}

init {
    (0 until childCount)
            .map { getChildAt(it) }
            .filter { it is NavigationMenuView }
            .forEach {
                mMenuView = it as NavigationMenuView
                mMenuView!!.overScrollMode = View.OVER_SCROLL_NEVER
            }
}

override fun inflateHeaderView(@LayoutRes res: Int): View {
    mHeader = LayoutInflater.from(context).inflate(res, this, false)
    setHeaderView(mHeader!!)
    return mHeader!!
}

@Deprecated("There can only be one header", ReplaceWith("#setHeaderView(view: View)"))
override fun addHeaderView(view: View) {
    throw IllegalAccessException("Please use #setHeaderView")
}

@UiThread
fun setHeaderView(view: View) {
    removeHeaderView()
    mHeader = view
    addView(mHeader, 0)
}

@Deprecated("No need to use params", ReplaceWith("#removeHeaderView()"))
override fun removeHeaderView(view: View) {
    removeHeaderView()
}

@UiThread
fun removeHeaderView() {
    if (mHeader != null) {
        removeView(mHeader)
        mHeader = null
    }
}

@Deprecated("No need to count, it is either 1 or zero", ReplaceWith("#hasHeader()"))
override fun getHeaderCount(): Int {
    return if (mHeader == null) 0 else 1
}

@Deprecated("No need to use params", ReplaceWith("#getHeaderView()"))
override fun getHeaderView(index: Int): View? {
    return getHeaderView()
}

fun getHeaderView(): View? {
    return mHeader
}

fun hasHeader(): Boolean {
    return mHeader != null
}

fun inflateFooterView(@LayoutRes res: Int): View {
    mFooter = LayoutInflater.from(context).inflate(res, this, false)
    setFooterView(mFooter!!)
    return mFooter!!
}

@UiThread
fun setFooterView(view: View) {
    removeFooterView()
    mFooter = view
    addView(mFooter, 0)
}

@UiThread
fun removeFooterView() {
    if (mFooter != null) {
        removeView(mFooter)
        mFooter = null
    }
}

fun hasFooter(): Boolean {
    return mFooter != null
}

fun getFooterView(): View? {
    return mFooter
}

fun setOnClickListener(@IdRes res: Int, listener: View.OnClickListener) {
    mHeader?.findViewById<View>(res)?.setOnClickListener(listener)
    mFooter?.findViewById<View>(res)?.setOnClickListener(listener)
}

override fun onMeasure(widthSpec: Int, heightSpec: Int) {
    super.onMeasure(widthSpec, heightSpec)
    val headerHeight = mHeader?.measuredHeight ?: 0
    val footerHeight = mFooter?.measuredHeight ?: 0
    val params = (mMenuView?.layoutParams as ViewGroup.MarginLayoutParams?)
    var changed = false
    if (params?.topMargin != headerHeight) {
        params?.topMargin = headerHeight
        changed = true
    }
    if (params?.bottomMargin != footerHeight) {
        params?.bottomMargin = footerHeight
        changed = true
    }
    if (changed) {
        mMenuView!!.measure(widthSpec, heightSpec)
    }
}
}

मूल रूप से नेवीगेशन व्यू RecyclerView पर पहले आइटम के रूप में एक LinearLayout बनाता है और सभी सामग्री को एक साथ स्क्रॉल करता है। इस पर विचार पाद और हेडर के लिए अलग-अलग दृश्य बनाने और फिर, गुरुत्वाकर्षण का उपयोग करके उन्हें ऊपर और नीचे धकेलने के लिए है। बाद में RecyclerView के लिए सामग्री को मापने पर स्क्रॉलिंग सामग्री को व्यवस्थित करता है।

यहाँ पुस्तकालय है जिसमें ऊपर लिखा कोड है। https://github.com/guness/NavigationView

इस के अच्छे पक्ष, अब मैं xml पर पाद लेख दृश्य को देशी पर हेडर की तरह परिभाषित कर सकता हूं:

    app:footerLayout="@layout/nav_footer_main"
    app:headerLayout="@layout/nav_header_main"

0

यहाँ एक समाधान घोंसले की आवश्यकता नहीं है कि और जो है गतिशील रूप से आंतरिक NavigationMenuView के नीचे गद्दी पाद लेख को देखने के अपने ऊंचाई है, जो पाद लेख की ऊंचाई करने के लिए सेट किया जा सकता है इसका मतलब है के आधार पर समायोजित कर देता है wrap_contentऔर आप गतिशील रूप से करने के लिए पाद लेख की दृश्यता को बदल सकते हैं VISIBLEया GONE

public class NavigationMenuFooterView extends LinearLayout {

    public NavigationMenuFooterView(Context context) {
        super(context);
    }

    public NavigationMenuFooterView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NavigationMenuFooterView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
        update(getHeight());
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        update(h);
    }

    private void update(int height) {

        ViewParent parent = getParent();
        if (parent instanceof ViewGroup) {
            View navigationMenuView = ((ViewGroup) parent).findViewById(R.id.design_navigation_view);
            if (navigationMenuView != null) {
                if (getVisibility() == View.GONE) {
                    height = 0;
                }
                navigationMenuView.setPadding(navigationMenuView.getPaddingLeft(),
                        navigationMenuView.getPaddingTop(), navigationMenuView.getPaddingRight(), height);
            }
        }
    }
}

आपको अपनी ids.xml में design_navigation_view की आईडी को परिभाषित करने की आवश्यकता है:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item name="design_navigation_view" type="id"/>
    </resources>

और इस तरह का उपयोग करें:

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_header"
        app:itemBackground="@drawable/drawer_item"
        app:itemIconTint="@color/drawer_item"
        app:itemTextColor="@color/drawer_item"
        app:menu="@menu/menu_drawer">

        <util.NavigationMenuFooterView
            android:id="@+id/navigation_footer_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:background="#fff"
            android:orientation="vertical">

            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#ddd" />

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

        </util.NavigationMenuFooterView>

    </com.google.android.material.navigation.NavigationView>

के साथ परीक्षण किया गया com.google.android.material:material:1.0.0


0

अगर आप लिस्टव्यू का उपयोग कर रहे हैं, तो आप इस तरह से कोशिश कर सकते हैं। सूची दृश्य समर्थन पाद लेख दृश्य फ़ंक्शन जोड़ते हैं, इसलिए आप नीचे दिए गए कोड के रूप में सूची ऑब्जेक्ट का उपयोग करके एक कस्टम पाद R.layout.drawer_footer दृश्य जोड़ सकते हैं

View footerView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.drawer_footer, expandableListView, false);
TextView footer = footerView.findViewById(R.id.id_footer_wta_version_information);
expandableListView.addFooterView(footerView);

मेरे मामले में, मैं listview के बजाय विस्तार योग्य सूची का उपयोग करता हूं (सूची में addFooter फ़ंक्शन भी है)। आशा है कि इस तरह से आपकी मदद करेंगे


-1

इन पंक्तियों को अपने मेनू लेआउट में डालें। मुझे उम्मीद है कि यह आपके मुद्दे को ठीक करेगा:

    <group
        android:id="@+id/grp11"
        android:checkableBehavior="single">

        <item


            android:title="" />
        <item


            android:title="" />
        <item

            android:title="" />
        <item


            android:title="" />
        <item


            android:title="" />
        <item

            android:title="" />

    </group>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.