Wie kann ich Fußzeileneinstellungen und Profilelemente auf NavitationView
setzen? sieht aus wie der Posteingang per E-Mail-Navigation. Die NavitationView
-Elemente werden von der Menüressource aufgebläht, aber ich weiß nicht, wie Sie die unteren Elemente auf eine Menüressource setzen oder wie kann ich eine benutzerdefinierte Ansicht auf NavigationView
oder einen unteren Versatz einstellen? Ich habe versucht, diesen <LinearLayout...>
als Fußzeilenansicht zu setzen, aber auf kleinen Bildschirmen legt die Fußzeile die Elemente über, und ich kann das Menü nicht scrollen. Ich habe versucht, eine Fußzeilenauffüllung auf NavigationView
zu setzen.
Dies ist kein Bildlauf auf kleinen Bildschirmen:
<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>
Dies scrollt, aber die Fußzeile befindet sich über den Menüelementen:
<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>
Schubladenmenü res/menu/drawer.xml
Datei:
<?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>
Wenn Sie eine feste (nicht scrollbare) Fußzeile in Ihrem Navigationsmenü haben möchten, müssen Sie die Navigationsansicht um ein anderes Layout wickeln, wie Sie es bereits geschrieben haben. NavigationView funktioniert wie FrameLayout, so dass das innere Layout oberhalb der Menüelemente von NavigationView "gestapelt" wird. Hier ist eine Möglichkeit, es mithilfe von LinearLayout für die Fußzeilenelemente anzuordnen:
Feste Fußzeile
<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>
Ich habe in diesem Beispiel TextViews verwendet, aber Sie können für die Fußzeilenansichten beliebig verwenden. Um zu vermeiden, dass sich die Fußzeilenelemente mit dem unteren Rand des Menüs überlappen, fügen Sie am Ende Ihrer Menüressourcendatei einige Dummy-Elemente hinzu (diese verhalten sich wie "Abstandhalter"):
res/menu/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>
Vergessen Sie nicht, in Ihrer Aktivität Klick-Listener für die tatsächlichen Fußzeilenansichten hinzuzufügen:
...
// 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
}
});
...
Scroll-Fußzeile
Wenn Sie zulassen, dass die Fußzeile mit dem Rest der Navigationsansicht scrollen kann, wird die Sache einfacher (keine zusätzlichen Layouts oder Klicklisten). Fügen Sie der Menüressourcendatei einfach die Fußzeilenelemente als eindeutigen <group>
hinzu (dies erstellt eine Trennlinie ), und alles wird automatisch behandelt und blättert zusammen:
res/menu/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>
Ich gebe Ihnen nur den Hinweis, wie Sie es lösen können, aber ich habe keine Möglichkeit, es in NavigationView zu testen, und bin mir ziemlich sicher, dass es funktionieren wird
hier die Beispiellayout-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>
hier ist das Ergebnis:
der Trick besteht darin, das Auffüllen auf das übergeordnete und den negativen Rand auf das untergeordnete Element anzuwenden.
Schneller Versuch:
<?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>
Nach den in den anderen Antworten der verschachtelten Navigationsansichten beschriebenen Ansätzen traten einige Probleme auf:
Meine Lösung für alle diese Probleme war folgende:
<?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>
Hier fungiert die NestedScrollView als übergeordnetes Element für die Unter-NavigationView ..__, dh die Unter-NavigationView zeigt niemals Bildlaufleisten selbst an, der gesamte Inhalt wird jedoch flach dargestellt.
Das Layout 'spacer_to_bottom' füllt den gesamten verbleibenden Platz aus, sodass sich die Fußzeile mit wenigen Menüsymbolen immer noch unten befindet.
Schließlich wird die feste Fußzeile zum linearen Layout hinzugefügt, das mit dem realen Menü (Unter-Navigationsansicht), dem Abstandhalter und der Fußzeile unten beginnt.
Das vollständige Arbeitsbeispiel finden Sie als AndroidStudio-Project: https://github.com/MarcDahlem/AndroidSidemenuFooterExample
Insbesondere die Navigationsleiste finden Sie hier: https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml
Die einfachste Antwort besteht darin, eine Schaltfläche in das Schubladenlayout einzufügen und die Schwerkraft im navigationview.xml
auf die unterste Position zu setzen.
Hier ist der Code:
<?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>
Sie benötigen ein Layout für die Containernavigationsansicht, das dann zwei weitere Navigationslayouts enthalten sollte. Sie richten diese an dem oberen und unteren Rand des übergeordneten Layouts aus.
Ich würde empfehlen, eine Navigationsansicht als übergeordnetes Element und nicht ein FrameLayout zu verwenden, da es sich im Wesentlichen um ein ScrimFrameLayout handelt und besser mit der Statusleiste interagiert.
Hier ist ein Beispiel, wie Ihre Aktivität aussehen sollte:
<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>
Sie können mehr darüber lesen und ein Beispiel hier sehen: http://blog.nitish.io/post/122633295558/Android-design-library-navigationview-with-top
Es ist eine Schande, dass NavigationView keine Möglichkeit hat, Fußzeilen hinzuzufügen. Aber Sie können so etwas versuchen,
<?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>
Wenn Ihre Fußzeile eine Liste ist,
app:headerLayout="@null"
app:menu="@menu/activity_base_drawer_footer"
Aber wenn es eine Art benutzerdefinierte Ansicht ist,
app:headerLayout="@layout/my_cutom_footer_view"
app:menu="@null"
In diesem Fall müssen Sie auch x = height of your custom footer view
einstellen.
Ich hoffe es hilft.
Wenn Sie Ihrem Ansatz folgen, können einige kleinere Änderungen helfen, was Sie erreichen möchten.
<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>
Legen Sie einige Stub-Elemente im Menü fest, damit sich die Menüelemente nicht überlappen.
<group>
...
<item
Android:title=""
Android:orderInCategory="200"/>
</group>
Außerdem möchten Sie Ihrem Fußzeilenelement einen Klicklistener hinzufügen.
NavigationView
erstes Kind ist die ListView
, die sowohl Kopf- als auch Menüelemente enthält.
Das einzige, was zum Hinzufügen einer Fußzeile erforderlich ist, ist der Aufruf von .addFooterView für die ListView
Weitere Informationen: http://www.andreabaccega.com/blog/2015/08/28/wie-zu-add-footer-nach-navigationsansicht/
Einfügecode kopieren:
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);
}
Ich kenne die späte Antwort, aber die perfekte und genaue Antwort, nach der die meisten Entwickler suchen.
Um eine Fußzeile in der Navigationsansicht hinzuzufügen, fügen Sie die benutzerdefinierte Ansicht wie folgt in das Navigationsmenü ein:
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>
Fügen Sie nun die obere Ansicht in Ihr Menü-XML mit Gruppenattribut ein. So kann es als Fußzeile im Menü unterschieden werden.
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>
Das ist es. Unten ist Ausgabe:
Meine Lösung mit festen Fußzeilen- und Scroll-Menüs (100% getestet)
<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>
So füge ich das Layout unten in der Navigation hinzu:
<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.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fillViewport="true">
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:weightSum="1">
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentTop="true"
Android:layout_gravity="top"
Android:layout_weight="0.8"
app:headerLayout="@layout/nav_header_home"
app:menu="@menu/activity_home_drawer" />
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_drawer_bottom"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_below="@+id/nav_view"
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>
</Android.support.design.widget.NavigationView>
</LinearLayout>
</RelativeLayout>
</Android.support.v4.widget.NestedScrollView>
</Android.support.design.widget.NavigationView>
Das gleiche habe ich auf folgende Weise gemacht: __.
<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>
Die Hauptsache ist hier, dass ich die Layout-Schwerkraft nach unten stellte, z.
**LinearLayout Android:layout_gravity="bottom"**
Ich verwende dieses Formular und arbeite für mich. in landschaft & porträt.
<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>
benutze das..
<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>
stellen Sie dann den unteren Abstand auf NavigationMenuView
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());
}
});
Versuchen Sie dies, diese Arbeit für mich.
<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>
Fügen Sie einfach ein anderes Layout in Ihre Navigationsansicht ein:
<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>
Der Trick besteht darin, layout_gravity = "bottom" zu verwenden - das gesamte Layout wird unten angezeigt und test2 wird richtig gestapelt.
Probieren Sie dies aus, diese Arbeit für mich . https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml
Sie können jedoch NavigationViewScrolling für glatteres Scrollen deaktivieren
private void disableNavigationViewScrolling(NavigationView navigationView) {
if (navigationView != null) {
NavigationMenuView navigationMenuView = (NavigationMenuView) navigationView.getChildAt(0);
if (navigationMenuView != null) {
navigationMenuView.setNestedScrollingEnabled(false);
}
}
}
Die Layoutstruktur für klebrige Kopf- und Fußzeilen im Schubladenmenü:
<?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>
Das komplette Layout:
<?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>
<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>
Dies funktioniert für mich, um Bilder in die Fußzeile der Navigationsleiste zu setzen (Hoch- und Querformat)
<?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>
mein nav_footer_main3 ist
<?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>
Meine persönliche Lösung für feste Kopf- und Fußzeilen erweitert NavigationView wie folgt:
/**
* 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)
}
}
}
Ursprünglich erstellt NavigationView ein LinearLayout als erstes Element in der RecyclerView und scrollt den gesamten Inhalt zusammen. Die Idee dabei ist, separate Ansichten für Fußzeile und Kopfzeile zu erstellen und diese dann mit Schwerkraft nach oben und unten zu verschieben. Durch das Messen des Inhalts für RecyclerView wird der Bildlaufinhalt festgelegt.
Hier ist die Bibliothek, die den obigen Code enthält, den ich geschrieben habe . https://github.com/guness/NavigationView
Gute Seite davon, jetzt kann ich die Fußzeilenansicht in der XML-Datei genauso wie die Kopfzeile in Native definieren:
app:footerLayout="@layout/nav_footer_main"
app:headerLayout="@layout/nav_header_main"
Fußzeile für Version> 23.x.x scrollen
Ich habe es endlich geschafft, das zu erreichen, was ich wollte. Leider sieht es so aus, als wäre es nicht mehr möglich, den Verweis auf die ListView zu ziehen und eine Kopf- und Fußzeile wie in Versionen unter 23.x.x (wie von Andrea Baccega beschrieben) hinzuzufügen. Dies ist für die Kopfzeile immer noch möglich:
<Android.support.design.widget.NavigationView
..
app:headerLayout="@layout/item_drawer_footer"
..
/>
Das Hinzufügen einer Fußzeile ist momentan jedoch nicht möglich. Ich habe jedoch eine Problemumgehung gefunden, falls Sie nur versuchen, eine Fußzeile hinzuzufügen: Sie kehren einfach die Ansicht um. Dadurch wird die Kopfzeile am unteren Rand hinzugefügt, die sich wie eine normale Fußzeile verhält. Stellen Sie einfach sicher, dass Sie Ihr Menü in umgekehrter Reihenfolge erstellen
// 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);