使用抽屉布局时,有没有办法将抽屉视图覆盖在操作栏上?我不想在显示抽屉时隐藏操作栏.我希望操作栏只是保持放置,但是要发送到后台.一个例子是iOS Play音乐应用程序……
我当前的实现隐藏并显示抽屉状态更改时的操作栏,但我不喜欢此用户体验.
public void onDrawerClosed(View view) { getActionBar().show(); invalidateOptionsMenu(); } public void onDrawerOpened(View drawerView) { getActionBar().hide(); invalidateOptionsMenu(); }
解决方法
我在网上搜索,以找到解决此问题的任何好方法,但没有找到.所以我做了一个这样的技巧.
首先,我们需要请求操作栏覆盖功能.所以在你的活动的onCreate()中,在setContntView()之前调用:requestWindowFeature(com.actionbarsherlock.view.Window.FEATURE_ACTION_BAR_OVERLAY);
它将使包括导航抽屉在内的一切都在动作栏后面绘制我们不需要这个,所以我们需要设置FrameLayout的上边距,它在活动中使用操作栏的精确高度来托管我们的片段.在活动的布局文件中,我们需要执行以下操作:
<!-- Framelayout to display Fragments --> <FrameLayout android:id="@+id/frame_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="?attr/actionBarSize" />
它只会使操作栏后面出现导航抽屉.
现在,当导航抽屉打开一半时,我们将隐藏操作栏,并在抽屉几乎关闭时显示.为此,我们需要在活动中进行以下操作:
@Override public void onDrawerSlide(View drawerView,float slideOffset) { super.onDrawerSlide(drawerView,slideOffset); if(slideOffset > 0.5){ actionBar.setBackgroundDrawable(null); actionBar.hide(); } else { actionBar.show(); if(slideOffset < 0.1){ actionBar.setBackgroundDrawable(layerDrawable); } } }
正如您所看到的,我还会更改操作栏的背景可绘制,以便在我开始隐藏它之前使其透明,并在我显示它时使用我的自定义背景将其更改回来.
我的自定义背景是一个layerListDrawable,它是透明的,但在底部有一个带有阴影的分隔符.
为了实现这一点,我在XML中定义了以下层列表:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:top="0dp" android:left="0dp" android:bottom="0dp" android:right="0dp"> <shape android:shape="rectangle"> <solid android:color="@android:color/transparent"/> </shape> </item> <item android:top="0dp" android:left="0dp" android:bottom="0dp" android:right="0dp"> <shape android:shape="rectangle"> <solid android:color="#afafaf"/> </shape> </item> <item android:top="0dp" android:left="0dp" android:bottom="0dp" android:right="0dp"> <shape android:shape="rectangle"> <gradient android:angle="270" android:startColor="#88afafaf" android:endColor="#33afafaf" /> </shape> </item> </layer-list>
为了从这个XML中获取我需要的背景,我在活动中执行以下操作:
final ActionBar actionBar = getSupportActionBar(); final LayerDrawable layerDrawable = (LayerDrawable) getResources() .getDrawable(R.drawable.shadow_divider); final TypedArray styledAttributes = getTheme().obtainStyledAttributes( new int[] { R.attr.actionBarSize }); int topOffset = (int) (styledAttributes.getDimension(0,0)); styledAttributes.recycle(); layerDrawable.setLayerInset(1,topOffset - 3,2); layerDrawable.setLayerInset(2,topOffset - 2,0); actionBar.setBackgroundDrawable(layerDrawable);
其中R.drawable.shadow_divider是我之前定义的XML层列表.
它看起来真的很棒!希望它可以帮助某人.
编辑
我这里有一个小虫子,有时可能是迷恋的原因.这是固定代码:
`
<FrameLayout android:id="@+id/frame_container" android:layout_width="match_parent" android:layout_height="match_parent" **android:paddingTop="?attr/actionBarSize"** />`
它应该是paddingTop而不是layout_marginTop!