Android导航抽屉和windowActionBarOverlay = true

我正在尝试在我的应用程序中实现新的Android导航抽屉。 我创建了一个BaseActivity.java来处理Drawer设置和监听器,我有两个扩展这个基类的子活动。 在第二个活动中,我计划使用以下attrs使用不同的操作栏样式:

true @android:color/transparent 

使操作栏透明,并使内容更丰富,因为我的布局中有一个图片标题。

我已经实现了这一点,但现在的问题是,因为内容正在扩展以利用使用ActionBar作为叠加层的额外空间,导航抽屉本身也在扩展并且它与ActionBar重叠,造成非常糟糕看布局:

在此处输入图像描述

我想要做的是,实际内容(将用片段填充的框架布局)占用额外空间,但导航抽屉仍然位于操作栏下方,类似于Play音乐应用程序:

在此处输入图像描述

关于我能做些什么来实现这一目标的任何想法?

编辑所以,根据Ahmad的帮助,我只在ListView上设置marginTop 。 这是布局:

  <ListView android:id="@+id/left_drawer" android:layout_marginTop="?android:attr/actionBarSize"  android:layout_marginBottom="0dp" android:layout_marginLeft="0dp" android:layout_marginRight="0dp" android:layout_width="240dp" android:layout_height="fill_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:background="?attr/listviewBackground" /> 

而现在,它对于顶端来说效果很好,但由于某种原因,在视图的底部还有一个边距,这对我来说根本没有任何意义。 这是一个截图 。

不确定是什么导致它:(

Solutions Collecting From Web of "Android导航抽屉和windowActionBarOverlay = true"

而现在,它对于顶端来说效果很好,但由于某种原因,在视图的底部还有一个边距,这对我来说根本没有任何意义。 这是一个截图。

如果将ListView引力设置为start | bottom,则可以解决您的问题。 底部没有添加额外的保证金。 看起来DrawerLayout默认重力是开始中心

  

如果有人对另一个人有兴趣接受这个问题。 这是发生了什么。

我尝试将边距设置为列表视图的顶部,如下所示:

 android:layout_marginTop="?android:attr/actionBarSize" 

但正如在编辑过的问题中所提到的那样,尽管没有在布局资源文件上设置,但是有一个奇怪的行为,其中底部也有一个边距。

所以,我正在密切关注Play音乐应用程序并注意到它实际上不是边距,而是一些填充,此外它们使用自定义背景填充填充指定的空间并使用透明颜色。

这是我做的:

  • 在ListView顶部设置填充,而不是边距:

    android:paddingTop="?android:attr/actionBarSize"

如前所述,重要的是不对每个设备的尺寸进行硬编码。

  • 创建一个自定义drawable,其顶部透明,然后是纯色的其余部分:

它看起来像这样:

            

请注意,我尝试在drawable上使用?android:attr/actionBarSize ,但这使得app强制关闭。 相反,我搜索了grepcode,并为操作栏find了一些不同大小的dimen文件,所以我将它们添加到我自己项目的dimen文件中。

  • 对于值:48dp
  • 对于价值 – 土地:40dp
  • 对于值-sw600dp:56dp

之后,我认为我看起来很棒,请注意截图视图中listview和操作栏的重叠方式,listview的透明部分尺寸恰到好处。

在此处输入图像描述

希望能帮助任何想知道如何实现这一目标的人。

您可以在布局的顶部设置边距,以便内容将自己绘制在ActionBar下方。

只需在父布局中添加:

 android:layout_marginTop="?android:attr/actionBarSize" 

与您已经猜到的一样,属性actionBarSize指的是ActionBar的大小。 您不能将绝对值设置为边距,因为ActionBar并非在所有Android设备上都具有相同的大小(平板电脑更大,手机设备更小)。

编辑:

将边距设置为ListView

     

Google音乐应用也会这样做:

在此处输入图像描述

我用paddingTop解决了这个问题:

    

希望有所帮助

我按照上面的指南创建了一个工作演示,并在2.x到5.x上进行了测试

你可以从Github克隆

重要的是在主要活动中

  toolbar = (Toolbar) findViewById(R.id.toolbar); res = this.getResources(); this.setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ScrimInsetsFrameLayout scrimInsetsFrameLayout = (ScrimInsetsFrameLayout) findViewById(R.id.linearLayout); scrimInsetsFrameLayout.setOnInsetsCallback(this); } 

和回电

 @Override public void onInsetsChanged(Rect insets) { Toolbar toolbar = this.toolbar; ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams(); lp.topMargin = insets.top; int top = insets.top; insets.top += toolbar.getHeight(); toolbar.setLayoutParams(lp); insets.top = top; // revert } 

绝对是V21的主题是神奇的