Java 操作栏顶部的抽屉布局
使用抽屉布局时,是否有方法将抽屉视图覆盖在操作栏上?我不想在显示抽屉时隐藏操作栏。我希望动作栏只是停留在原地,但被发送到后台。iOS Play音乐应用程序就是一个例子 我当前的实现在抽屉状态更改时隐藏并显示操作栏,但我不喜欢这种用户体验Java 操作栏顶部的抽屉布局,java,android,android-actionbar,navigation-drawer,drawerlayout,Java,Android,Android Actionbar,Navigation Drawer,Drawerlayout,使用抽屉布局时,是否有方法将抽屉视图覆盖在操作栏上?我不想在显示抽屉时隐藏操作栏。我希望动作栏只是停留在原地,但被发送到后台。iOS Play音乐应用程序就是一个例子 我当前的实现在抽屉状态更改时隐藏并显示操作栏,但我不喜欢这种用户体验 public void onDrawerClosed(View view) { getActionBar().show(); invalidateOptionsMenu(); }
public void onDrawerClosed(View view) {
getActionBar().show();
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
getActionBar().hide();
invalidateOptionsMenu();
}
这是Android默认设置中的正确效果。如果您想模拟iOS效果,您可能必须自己进行,因为AFAIK支持库的抽屉组件不允许这种类型的配置
不管怎么说,每次程序员编写大量代码只是为了在Android中模拟一些奇特(而且可能不值得)的iOS效果,一只小猫就死了……我不认为你能用Android提供的导航抽屉做到这一点(而不是做一些真正的黑客行为),因为这样做确实违背了Android的设计模式。若你们想要一个能满足你们需求的库,在Android推出自己的小部件之前,我就已经用过这个库了,它能满足你们的需求 您可以通过ActionBarSherlock实现这一点
你可以这样做,但抽屉看起来很别扭,你会不喜欢的。我也有同样的要求,最后我使用了定制的单选按钮来显示为选项卡。您也可以尝试在抽屉打开时隐藏标签,反之亦然,但这肯定不是您想要的 您可以尝试使用ViewPager、选项卡式指示器,如PagerTabStrip和/或TabPageIndicator
.为了找到解决这个问题的好办法,我在网上搜索,但没有找到。所以我耍了个小把戏 首先,我们需要请求操作栏覆盖功能。因此,在活动的
onCreate()
中,在setContntView()之前调用:requestWindowFeature(com.actionbarsherlock.view.Window.FEATURE\u ACTION\u BAR\u 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" />
其中R.drawable.shadow_divider是我前面定义的XML层列表
看起来真的很棒!希望它能帮助别人
编辑
我在这里有一个小错误,这可能是一个原因,有时迷恋。以下是固定代码:
`
`
它应该是paddingTop而不是layout\u marginTop 我在问题中找到了答案,还添加了一个示例项目供参考。你可以看看它是否适合你。
我完全同意你的看法,但客户希望在iOS和Android上获得同样的体验。看来我要去海关了。谢谢,我明白。。。我以前就有过这样的经历,很多客户都希望Android版本与iOS版本完全相同,但相信我,要让他们相信这有多糟糕,通常要比在Android上重新记录所有iOS效果花费更少的努力。我想,“效果”并不是破坏用户体验的因素。“小猫死了”的说法既愚蠢又有争议……首先,我是一名专业的安卓开发者。在一个以其创造的品质为傲的时代里,全职工作。话虽如此,我同意有些模式不应该跨平台,但并不是每一种非共同效应都是不好的。如果你在做一些定制的事情时没有测试你的应用程序,那是你的错!说我发布了未经测试的低质量应用程序是粗鲁的。如果客户想要某样东西并为之付费,而这只是一个很小的不重要的影响,那么这是完全合理的!现在使用ActionBarSherlock是一个坏主意。这不是一个坏主意,只是不是最好的主意。使用第三方库提供与Google提供的官方支持库几乎相同的功能,只是为了实现动画,这显然是一个坏主意,sorry@thelawnmowerman不是。ABS和ABC的做法基本相同,只是采取了不同的方法。老实说,我喜欢ABS采用的方法比ABC好得多。在向后兼容性方面,ABS几乎是一个标准。有相当多的可用库比操作系统提供的原始功能更好(不仅适用于Android…)。(反对票!)感谢您提供滑动菜单的链接。我以前看过,排除了这个可能性。现在看来,这可能是一个不错的选择。
@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);
}
}
}
<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>
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, 0, topOffset - 3, 0, 2);
layerDrawable.setLayerInset(2, 0, topOffset - 2, 0, 0);
actionBar.setBackgroundDrawable(layerDrawable);
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
**android:paddingTop="?attr/actionBarSize"** />`