フッター設定とプロファイルアイテムを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>
ナビゲーションメニューに固定(スクロールしない)フッターが必要な場合は、投稿したように、NavigationViewを別のレイアウトにラップする必要があります。 NavigationViewはFrameLayoutと同様に機能するため、NavigationViewメニュー項目の上に内部レイアウトを「積み重ねる」ことになります。次に、フッターアイテムにLinearLayoutを使用して配置する1つの方法を示します。
固定フッター
<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>
この例ではTextViewを使用しましたが、フッタービューには何でも使用できます。フッターアイテムがメニューの下部と重複しないようにするには、メニューリソースファイルの最後にダミーアイテムを追加します(これらは「スペーサー」のように機能します)。
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>
最後に、実際のフッタービューのアクティビティにクリックリスナーを追加することを忘れないでください。
...
// 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
}
});
...
フッターのスクロール
ただし、フッターをNavigationViewの残りの部分でスクロールできるようにすると、より簡単になります(追加のレイアウトやクリックリスナーはありません)。フッターアイテムを一意の<group>
としてメニューリソースファイルに追加するだけです(これにより (区切り線 が作成されます)。すべてが自動的に処理され、一緒にスクロールします。
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>
解決方法のヒントをお伝えしますが、NavigationViewでテストする機会はありません。
サンプルレイアウト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>
ネストされたナビゲーションビューの他の回答で説明されているアプローチに従って、いくつかの問題が発生しました。
これらすべての問題に対する私の解決策は次のとおりです。
<?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は、サブNavigationViewのスクロール親として機能します。つまり、サブNavigationViewはスクロールバー自体を表示することはありませんが、コンテンツ全体がフラットな方法で表示されます。
レイアウト「spacer_to_bottom」は残りのすべてのスペースを埋めるので、メニューアイコンがほとんどなくても、フッターは下部にあります。
最後に、固定フッターがリニアレイアウトに追加されます。これは、実際のメニュー(サブナビゲーションビュー)、スペーサーから始まり、フッターが下部にあります。
ここでは、完全な動作例をAndroidStudio-Projectとして見つけることができます。 https://github.com/MarcDahlem/AndroidSidemenuFooterExample
特にナビゲーションドロワーはここにあります: https://github.com/MarcDahlem/AndroidSidemenuFooterExample/blob/master/app/src/main/res/layout/activity_main.xml
最も簡単な答えは、Drawerレイアウト内にボタンを追加し、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つのナビゲーションレイアウトを含める必要があります。それらを親レイアウトの上下に揃えます。
ナビゲーションビューは基本的にScrimFrameLayoutであり、ステータスバーとの相互作用が優れているため、FrameLayoutではなく親としてナビゲーションビューを使用することをお勧めします。
アクティビティの例を次に示します。
<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
NavigationViewにはフッターを追加する機能がありません。しかし、あなたはこのようなものを試すことができます、
<?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
を設定する必要があります
それが役に立てば幸い。
あなたのアプローチに従って、いくつかの小さな変更はあなたが達成したいものを助けることができます。
<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>
また、フッターアイテムにクリックリスナーを追加することもできます。
私はその遅い答えを知っていますが、ほとんどの開発者が探している完璧で正確な答えを知っています。
ナビゲーションビューにフッターを追加するには、以下のようにカスタムビューをナビゲーションメニューに追加します。
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>
それでおしまい。出力は次のとおりです。
NavigationView
最初の子は、ヘッダーとメニュー項目の両方を含むListView
です。
フッターを追加するために必要なのは、ListViewに.addFooterViewを呼び出すことだけです
詳細: 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);
}
フッターとスクロールメニューを修正したソリューション(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>
これは、ナビゲーションの下部にレイアウトを追加する方法です:
<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>
私は次の方法で同じことを作りました
<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"**
私はこのフォームを使用します。横向きと縦向き。
<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>
これを使って..
<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>
次に、下部のパディングを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());
}
});
これを試してください、これは私のために働きます。
<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>
NavigationView内に別のレイアウトを配置するだけです。
<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>
トリックは、layout_gravity = "bottom"を使用することです。これにより、レイアウト全体が下部に配置され、test、test2が適切にスタックされます。
これを試してください、これは私のために働いています. 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);
}
}
}
引き出しメニューの固定ヘッダーとフッターのレイアウト構造:
<?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>
<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>
これは、ナビゲーションドロワーのフッターに画像を配置するために働いています(縦向きと横向き)
<?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>
固定ヘッダーとフッターの個人的なソリューションは、NavigationViewを次のように拡張します。
/**
* 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)
}
}
}
本来、NavigationViewは、RecyclerViewの最初のアイテムとしてLinearLayoutを作成し、すべてのコンテンツを一緒にスクロールします。これに関するアイデアは、フッターとヘッダーに別々のビューを作成し、Gravityを使用してそれらを上下にプッシュすることです。後で、RecyclerViewのコンテンツを測定して、スクロールするコンテンツを確定します。
以下は、私が書いた上記のコードを含むライブラリです。 https://github.com/guness/NavigationView
これの良い面は、ネイティブのヘッダーと同じように、xmlでフッタービューを定義できるようになりました。
app:footerLayout="@layout/nav_footer_main"
app:headerLayout="@layout/nav_header_main"
バージョン> 23.x.xのスクロールフッター
最終的に私は望んでいたものを達成することができましたが、残念ながら、リストビューへの参照を取得し、23.x.xより下のバージョンのようにヘッダーとフッターを追加することはもはや不可能に見えます(Andrea Baccegaによる)。ヘッダーに対してこれを行うことはまだ可能です:
<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);