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

Posted

技术标签:

【中文标题】在屏幕底部设置 Android 抽屉式菜单页脚【英文标题】:Set Android navigation drawer menu footer at bottom of screen 【发布时间】:2017-12-04 05:54:35 【问题描述】:

我正在尝试做一些我从一开始就知道很难实现的事情,那就是在屏幕底部为导航抽屉菜单放置一个页脚。

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

为此,我将在下一个方式中使用 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_
    android:layout_
    android:gravity="start"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/drawer_footer"
        android:layout_
        android:layout_
        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 只是表现正常,如果元素在屏幕上都是可见的,并且底部有很多空白空间,页脚就放在最后一个元素的下方(对我想要实现的目标不利)。

我在不同的 *** 帖子中尝试了许多建议但无济于事,经过一段时间的努力,我能够得到非常接近我需要的东西,这是下一个:

我已经给所有列表视图元素一个固定的高度和相同的标题,所以最后我用 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_
    android:layout_>

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

    //MAIN CONTENT

    <ListView
        android:id="@+id/left_drawer"
        android:layout_
        android:layout_
        android:layout_gravity="left|start"
        android:headerDividersEnabled="true"
        android:background="#ffeeeeee"/>

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

【问题讨论】:

这可能会有所帮助***.com/questions/30543605/… 感谢您的回复和时间@seon,我终于解决了我的问题,如下所述。 【参考方案1】:

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

关键是为 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;
    

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

【讨论】:

以上是关于在屏幕底部设置 Android 抽屉式菜单页脚的主要内容,如果未能解决你的问题,请参考以下文章

用于按钮的 Android 滑动抽屉

android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕

在响应式页脚菜单中添加“固定”div

如何将页脚保持在屏幕底部[重复]

jQuery Mobile,在不使用 data-position="fixed" 的情况下将页脚设置为屏幕底部,这可能吗?

如何正确对齐社交页脚和页脚菜单的中心?