简体   繁体   中英

Bottom layout on a navigation drawer Android

Trying to add a footer to a navigation drawer that consists of two lists. I am not doing this right, I understood that anything that i want in the navigation drawer should be encapsulated in the

<LinearLayout
            android:id="@+id/left_drawer_layout"

I would like to add a bottom layout that does not depend on ListView scroll. I tried different versions of where to add the bottom layout code but nothing happens. I need an extra eye, please. Thank you.

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

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

        <include
            android:id="@+id/toolbar"
            layout="@layout/toolbar”/>



        <!-- Framelayout to display Fragments -->

        <FrameLayout
            android:id="@+id/frame_container"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

    </LinearLayout>


    <!-- Listview to display slider menu -->

    <LinearLayout
        android:id="@+id/left_drawer_layout"
        android:layout_width="@dimen/navigation_drawer_max_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:orientation="vertical">


        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:background="@color/list_background">

            <Button
                android:id="@+id/refreshBtn"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:text="@string/refresh"
                android:visibility="gone" />

            <EditText
                android:id="@+id/searchMenuTxt"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:background="@color/list_background_pressed"
                android:drawableLeft="@drawable/search_web"
                android:drawablePadding="@dimen/activity_horizontal_margin"
                android:drawableStart="@drawable/search_web"
                android:focusable="false"
                android:focusableInTouchMode="true"
                android:hint="@string/search"
                android:paddingLeft="8dp"
                android:singleLine="true"
                android:textColorHint="@android:color/darker_gray"
                android:textSize="@dimen/text_size_14"></EditText>

            <Button
                android:id="@+id/clearBtn"
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:layout_gravity="right|center"
                android:background="@drawable/mob_clear"
                android:paddingRight="8dp"
                android:visibility="invisible" />

        </FrameLayout>

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

            <ListView
                android:id="@+id/activeChatsList"
                android:layout_width="@dimen/navigation_drawer_max_width"
                android:layout_height="wrap_content"
                android:layout_gravity="start"
                android:background="@color/list_background_pressed"
                android:choiceMode="singleChoice"
                android:divider="@drawable/list_divider"
                android:dividerHeight="1dp"
                android:fadeScrollbars="false"
                android:fastScrollEnabled="false" />

            <ListView
                android:id="@+id/drawerListView"
                android:layout_width="@dimen/navigation_drawer_max_width"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                android:background="@drawable/list_selector"
                android:choiceMode="singleChoice"
                android:divider="@drawable/list_divider"
                android:dividerHeight="1dp"
                android:drawSelectorOnTop="true"
                android:fastScrollEnabled="false"
                android:minHeight="250dp" />
            <LinearLayout
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:layout_weight="1"
                android:layout_alignParentBottom="true">

                <Button android:id="@+id/CancelButton" android:layout_width="wrap_content"
                    android:layout_height="wrap_content" android:text=“Profile" />
                >

            </LinearLayout>
        </LinearLayout>


    </LinearLayout>

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

You can have the basic idea from this code snippet. And android now has the built-in functionality for menu drawer. What you are trying to do is old approach. Actionbar sherlock is deprecated. So i would recommend you to move to AppCompat. With Appcompat following is the code for having the layout of menu drawer along with the footer.

drawer_fragment.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res/com.focial"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent" >

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white" >

    <LinearLayout
        android:id="@+id/footer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom"
        android:clickable="true"
        android:background="@android:color/black"
        android:orientation="vertical">

     <!-- any addition stuff you want in yoour footer layout -->

   </LinearLayout>

    <ListView
        android:id="@+id/drawer_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/footer"
        android:choiceMode="singleChoice"
        android:dividerHeight="1dp" />
</RelativeLayout>

activity_home.xml (where you want to enable/show drawer)

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

<FrameLayout
    android:id="@+id/realcontent"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<fragment
    android:id="@+id/navigation_drawer"
    android:name="com.focial.fragment.NavigationDrawerFragment"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start" />

HomeActivity.java

private NavigationDrawerFragment mNavigationDrawerFragment;
private ArrayList<DrawerItem> drawerItems;
private DrawerLayout drawerLayout;

protected void initUIComponents() {
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
    mNavigationDrawerFragment.setUp(R.id.navigation_drawer, drawerLayout, drawerItems);
}

@Override
public void onNavigationDrawerItemSelected(int itemlabelId) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.realcontent, CustomFragmentManager.newInstance(itemlabelId)).commit();
}

NavigationDrawerFragment.java

View rootView = (RelativeLayout) inflater.inflate(R.layout.layout_fragment_drawer, container, false);
ListView mDrawerListView = (ListView) rootView.findViewById(R.id.drawer_list);
    LinearLayout footerView = (LinearLayout) rootView.findViewById(R.id.footer);

Your left drawer layout do not necessarily need to be a LinearLayout , it could be something like:

<RelativeLayout
    android:id="@+id/left_drawer_layout"
    android:layout_width="@dimen/navigation_drawer_max_width"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/drawer_footer"
        android:layout_gravity="start"
        android:orientation="vertical">

        <!-- YOUR PREVIOUS LAYOUT -->
    </LinearLayout>

    <LinearLayout 
        android.id="@+id/drawer_footer"
        android:layout_width="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_height="100dp">
        <!-- YOUR FOOTER WITH layout_alignParentBottom -->
    </LinearLayout>
</RelativeLayout>

That way your footer will always be on the bottom of your left drawer.

you can use this drawer on your project or some layout like what used on this project https://github.com/neokree/MaterialNavigationDrawer

project have addBottomSection method for footer layout

you can see example of this project in this apk: https://github.com/neokree/MaterialNavigationDrawer/blob/master/example.apk

Because your drawerListView 's android:layout_height="match_parent" , so the it's take all height left in scree and push the bottom layout out of screen.
You can try this:

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

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/activeChatsList" />

    <ListView
        android:id="@+id/drawerListView" />
</LinearLayout>

<Button
    android:id="@+id/CancelButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="“Profile" />

</LinearLayout>

Beside of that, I suggest you should use 1 list view with multi viewType in adapter instead of 2 separate list views because if the 1st scrollable then the 2nd will not show up or if the 2nd show up, that mean the 1st doesn't need to scroll so it's meaningless to be a listview.
Hop this helps.

最好的方法是为页脚创建另一个布局,并将该布局添加到列表页脚。

listView.addFooterView(R.layout.<your footer layout>);

This is only suggestion. I am adding this as my answer because I dont have enough reputation to add a comment on others posts, Sorry.I think this is already solved in SO. Please check the below this link How to put list items at the bottom of list view in Navigation Drawer like Foursquare

you can use ActionBarSherlock library. I think It is so helpfull.

You have to use frame layout after the drawer control tag.

Place all controls in the frame layout.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM