以编程方式设置NavigationDrawer的ListView边距

时间:2014-12-11 14:29:31

标签: android android-listview navigation-drawer android-toolbar

我目前正在努力按照我想要的方式设计我的应用程序。 在我的应用程序中,我使用的是NavigationDrawer和不同的片段。通过单击NavigationDrawer中的项目,我将换出当前活动的片段。 有一个主要片段显示地图,但不显示工具栏。当我切换到另一个片段时,我想显示我的工具栏并让用户与之交互。 现在,当我显示工具栏时,我必须将NavigationDrawer的上边距设置为工具栏的大小,这样它就不会重叠。

当我显示工具栏时,我设置了NavigationDrawer列表视图的边距,如下所示:

ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mDrawerListView.getLayoutParams();
params.setMargins(0, drawerMarginTop, 0, 0);
mDrawerListView.setLayoutParams(params);
mDrawerListView.requestLayout();

结果就像我期望的完全相反。看起来边距应用于视图的底部。

截图:

Listview margin not correctly set

让我烦恼的另一件事是工具栏的切换箭头没有正确居中。它比应有的高一点,因此它与顶部的系统栏重叠,并且不会填充工具栏的整个大小。我试图在下面的图片中说明这一点:

enter image description here

如果您需要任何xml或代码,请告诉我,我将编辑我的问题。

提前谢谢!

编辑1 + 2:

我的工具栏样式:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar_navigation"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/my_color"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

</android.support.v7.widget.Toolbar>

编辑3:

现在修复了切换箭头未居中的问题。感谢Alchete。

不幸的是,NavigationDrawer仍然是错误的。我发现如果我多次打开和关闭NavigationDrawer它会以某种方式改变其布局并且边距设置正确...有没有办法强制立即发生这个顶部?

经过多次打开和关闭抽屉后,它看起来像这样:(正是我希望它看起来像)

enter image description here

必须有办法立即强迫这个,对吧?

2 个答案:

答案 0 :(得分:1)

您的对齐问题很可能是由于您的工具栏高度造成的。您应该按如下方式设置工具栏高度:

<android.support.v7.widget.Toolbar 
    android:layout_height="?attr/actionBarSize">

以下是相同的问题供参考:android.support.v7.widget.Toolbar icon alignment issue

我也会使用Google的IOSched应​​用程序来参考如何正确设置这些项目。您可以在Github上找到所有代码。

这是他们的布局文件。向下滚动以查看其工具栏/导航器布局:https://github.com/google/iosched/tree/dfaf8b83ad1b3e7c8d1af0b08d59caf4223e0b95/android/src/main/res/layout

而且,还要注意Google的参考设计是使用navdrawer覆盖工具栏 - 这不是你拥有它的方式。并且,右边距应该等于工具栏高度。

见这里:http://www.google.com/design/spec/patterns/navigation-drawer.html

enter image description here

答案 1 :(得分:0)

我不是100%关于这个,但看起来你将ViewGroup布局参数设置为MarginLayoutParams类型。相反,将边距设置为“普通”根ViewGroup类型,例如RelativeLayout并将其传递给View:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT);
params.setMargins(0, drawerMarginTop, 0, 0);
mDrawerListView.setLayoutParams(params);
mDrawerListView.requestLayout();

您可能希望根据您的xml将MATCH_PARENT更改为WRAP_CONTENT。