在屏幕底部设置 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 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕
jQuery Mobile,在不使用 data-position="fixed" 的情况下将页脚设置为屏幕底部,这可能吗?