如何将DrawerLayout显示在ActionBarToolbar和status bar之间

如何将DrawerLayout显示在ActionBarToolbar和status bar之间,第1张

首先使用 Toolbar 来代替ActionBar ,这样我们就能够把ActionBar嵌入到我们的View体系中,然后我们"禁用"系统的status bar,由 DrawerLayout 来处理status bar,最后抽屉部分往上移,或者裁剪掉status bar那一部分。

控制Status bar

在你的values-v21里面添加新的主题,并设置一下属性

values-v21/themes.xml

<style name="AppTheme">

<item name="android:windowDrawsSystemBarBackgrounds">true</item>

<item name="android:statusBarColor">@android:color/transparent</item>

</style>

这里解释一下:

windowDrawsSystemBarBackgrounds ,将它设置为true,系统将在你的window里面绘制status bar,默认为 TRUE ,之所以要写出来是因为你的theme有可能是继承过来的,确保为true。(在这里小插曲一下,因调试时,总以为注释了这段代码就以为是false,程序员思维害苦了我。另外从命名来看,Android把它称为system bar,可能是为了与能被我们处理的status bar区分开而做的改变。)

statusBarColor 设置为透明是因为我们不再需要系统的status bar,因为我们无法控制它的位置,后面我们将交由 DrawerLayout 来处理。

使用DrawerLayout

首先,你的布局文件应该是和这个类似的:

<android.support.v4.widget.DrawerLayout

xmlns:android="url"

android:id="@+id/my_drawer_layout"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fitsSystemWindows="true">

<!-- Your normal content view -->

<LinearLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<!-- We use a Toolbar so that our drawer can be displayed

in front of the action bar -->

<android.support.v7.widget.Toolbar

android:id="@+id/my_awesome_toolbar"

android:layout_height="wrap_content"

android:layout_width="match_parent"

android:minHeight="?attr/actionBarSize"

android:background="?attr/colorPrimary" />

<!-- The rest of your content view -->

</LinearLayout>

<!-- The navigation drawer -->

<ScrimInsetsFrameLayout xmlns:android="rul"

xmlns:app="url"

android:layout_width="304dp"

android:layout_height="match_parent"

android:layout_gravity="left"

android:background="@android:color/white"

android:elevation="10dp"

android:fitsSystemWindows="true"

app:insetForeground="#4000">

<!-- Your drawer content -->

</ScrimInsetsFrameLayout>

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

在这里布局里面我们用到了一个的开源类 ScrimInsetsFrameLayout ,它的主要作用就是利用 fitsSystemWindows 的回调方法 fitSystemWindows(Rect insets) 来获取status bar的大小,然后调整画布已达到去掉status bar的效果,所以我们需要在ScrimInsetsFrameLayout 下设置 fitsSystemWindows 为true。当然你也可以不使用这个类,而改用 layout_marginTop 属性来达到效果。

insetForeground 这个属性是ScrimInsetsFrameLayout自带的,表示插入区域的前景色,我们设置为带透明的黑色#4000。别忘了使用这个属性需要添加如下代码到attrs.xml里:

values/attrs.xml

<declare-styleable name="ScrimInsetsView">

<attr name="insetForeground" format="reference|color" />

</declare-styleable>

自此,我们已经实现了将DrawerLayout抽屉的那一部分显示在 Toolbar 和systembar(为了和下面的status bar区分,我们称为system bar)之间了,可是system bar的颜色被我们设置了透明,所以我们接下来要改变status bar的颜色。

改变Status bar的颜色

你可能已经注意到刚才的布局里面 DrawerLayout 的 fitsSystemWindows 属性设置了为true,这是因为我们要在代码里面使用了 DrawerLayout 设置status bar颜色的方法:

// 在这里我们获取了主题暗色,并设置了status bar的颜色

TypedValue typedValue = new TypedValue()

getTheme().resolveAttribute(R.attr.colorPrimaryDark, typedValue, true)

int color = typedValue.data

// 注意setStatusBarBackgroundColor方法需要你将fitsSystemWindows设置为true才会生效

DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.my_drawer_layout)

drawerLayout.setStatusBarBackgroundColor(color)

使用ToolBar来代替ActionBar

在代码里面这样设置:

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar)

setSupportActionBar(toolbar)

可以用一个布局文件比如LinearLayout,但记得要加上android:layout_gravity="start"这个属性,不然会报错。

LinearLayout里面就可以写你想要的东西了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11252562.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存