在屏幕底部设置Android导航抽屉菜单页脚

时间:2017-06-30 09:53:08

标签: android listview footer drawer

我正在尝试做一些事情,从一开始我就已经知道它很难实现,而且要在屏幕底部放置一个页脚导航抽屉菜单。

事实是,当抽屉的列表视图项目在屏幕上都可见时,我需要页脚正好位于屏幕的底部,当元素离开屏幕时,页脚应该位于最后一项的下方和滚动条出现(正常行为)。

为此我正在以下一种方式使用addFooterView方法

ViewGroup footer = (ViewGroup)inflater.inflate(R.layout.testme_drawer_footer, mDrawerList, false);

mDrawerList.addFooterView(footer, null, false);

testme_drawer_footer是下一个布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/footer_menu_facebook"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="start"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/drawer_footer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="#8d3169"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:textColor="#fff"
        android:textSize="12sp"/>

</LinearLayout>

没有做任何事情,addFooterView只是表现正常的方式,如果元素在屏幕上都是可见的,并且底部留下了很多空白区域,页脚只是放在最后一个元素下面(对我想要实现的目标不好)。

我在不同的StackOverflow帖子中尝试了很多建议但没有用,经过一段时间的努力,我能够得到一些非常接近我需要的东西,这是下一个:

我已经给所有列表视图元素一个固定的高度和相同的标题,所以最后我用screenHeight计算页脚高度 - statusBarHeight - actionBarHeight - drawerHeaderHeight - listViewElementHeight * numberOfElements在下一个方式:

ViewGroup footer = (ViewGroup)inflater.inflate(R.layout.testme_drawer_footer, mDrawerList, false);

        int screenHeight = GeneralUtils.getScreenHeight(oActivity);
        int statusBarHeight = GeneralUtils.getStatusBarHeight(oActivity);
        int actionBarHeight = GeneralUtils.getActionBarHeight(oActivity);
        int drawerHeaderHeight = GeneralUtils.dp2px(60, oActivity);
        int menuItemHeight = drawerHeaderHeight;
        int totalItemsHeight = menuItemHeight*(endItem-startItem+1);

        int footerHeight = screenHeight - statusBarHeight - actionBarHeight - drawerHeaderHeight - totalItemsHeight;
        footer.setMinimumHeight(footerHeight);

        mDrawerList.setFooterDividersEnabled(true);
        mDrawerList.addFooterView(footer, null, false);

但是很可能一些高度测量方法并不十分准确,并且某些像素的差异在所有测试设备中并不相同。

我知道这不是最好的方法,事实上我不喜欢它,我不喜欢设置一个固定的高度抽屉头和wrap_content的元素,我不喜欢计算整体这种方式的高度,但找不到任何其他工作方式来实现这一点。

任何帮助?

提前致谢!

这是我在所有活动中设置ListView的方式:

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:id="@+id/llMainMain"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:background="#ffffff"
                  android:orientation="horizontal">

    //MAIN CONTENT

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="@dimen/navigation_drawer_width_phone"
        android:layout_height="match_parent"
        android:layout_gravity="left|start"
        android:headerDividersEnabled="true"
        android:background="#ffeeeeee"/>

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

1 个答案:

答案 0 :(得分:0)

经过一整天的努力,我终于找到了一个非常准确的解决方案,我会回答我自己的问题,以帮助那些可能面临同样问题的人。

关键是将固定高度设置为ListView项目(在我的情况下,我已设置固定高度为60dp)并在使用TreeObserver绘制之前计算ListView高度,然后您只需将固定项目高度乘以项目数量并将此值减去ListView高度。在我的情况下,我不得不将标题高度(也是固定的)和项目分隔符大小添加到ListView的总高度,所以最后我的代码如下所示:

final int numberOfItems = endItem - startItem + 1;
        final ViewTreeObserver treeObserver = mDrawerList.getViewTreeObserver();
        treeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {

    mDrawerList.getViewTreeObserver().removeOnGlobalLayoutListener(this);

                int mDrawerListHeight = mDrawerList.getHeight();
                int dividerHeight = mDrawerList.getDividerHeight() * numberOfItems;
                int footerHeight = calculateFooterHeight(oActivity, mDrawerListHeight, numberOfItems, dividerHeight);

                ViewGroup footer = (ViewGroup)inflater.inflate(R.layout.testme_drawer_footer, mDrawerList, false);
                footer.setMinimumHeight(footerHeight);

                mDrawerList.setFooterDividersEnabled(true);
                mDrawerList.addFooterView(footer, null, false);

                UserSession us = new UserSession(oActivity);
                String footerText = us.getUserSession().getAlias();

                TextView tvDrawerFooter = (TextView) oActivity.findViewById(R.id.drawer_footer);
                tvDrawerFooter.setText(footerText);

                // Set the list's click listener
                DrawerItemClickListener drawer = new DrawerItemClickListener();
                drawer.oActivity = oActivity;
                mDrawerList.setOnItemClickListener(drawer);
            }
        });

private static int calculateFooterHeight(Activity oActivity, int listViewHeight, int numberOfItems, int dividerHeight){

        int drawerHeaderHeight = GeneralUtils.dp2px(60, oActivity);
        int menuItemHeight = drawerHeaderHeight;
        int totalItemsHeight = menuItemHeight * numberOfItems;

        return listViewHeight - drawerHeaderHeight - totalItemsHeight - dividerHeight;
    }

我真的希望我可以帮助其他人解决同样的问题。