Java 操作栏顶部的抽屉布局

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(); }

使用抽屉布局时,是否有方法将抽屉视图覆盖在操作栏上?我不想在显示抽屉时隐藏操作栏。我希望动作栏只是停留在原地,但被发送到后台。iOS Play音乐应用程序就是一个例子

我当前的实现在抽屉状态更改时隐藏并显示操作栏,但我不喜欢这种用户体验

        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"**  />`