12

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>
Misha Akopov
  • 12,241
  • 27
  • 68
  • 82
Gabi Radu
  • 1,107
  • 2
  • 16
  • 35

8 Answers8

3

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);
Faizan Tariq
  • 351
  • 4
  • 14
0

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.

Logain
  • 4,259
  • 1
  • 23
  • 32
  • Consider a FrameLayout instead and using gravity for better performance. The RelativeLayout is expensive as it measures twice. – JohanShogun Aug 01 '15 at 10:36
0

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

Siavash Abdoli
  • 1,852
  • 3
  • 22
  • 38
0

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.

justHooman
  • 3,044
  • 2
  • 17
  • 15
0

Best way is to create another layout for footer and add that layout to your list footer.

listView.addFooterView(R.layout.<your footer layout>);
Pankaj kumar
  • 1,357
  • 14
  • 13
0

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

Community
  • 1
  • 1
Ansal Ali
  • 1,583
  • 1
  • 13
  • 30
0

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

-1

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

Place all controls in the frame layout.