我正在尝试做一些事情,从一开始我就已经知道它很难实现,而且要在屏幕底部放置一个页脚导航抽屉菜单。
事实是,当抽屉的列表视图项目在屏幕上都可见时,我需要页脚正好位于屏幕的底部,当元素离开屏幕时,页脚应该位于最后一项的下方和滚动条出现(正常行为)。
为此我正在以下一种方式使用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>
答案 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;
}
我真的希望我可以帮助其他人解决同样的问题。