让DrawerLayout在ActionBar上滑动

25

我在一个活动中有一个滑动抽屉菜单,其中有一个带有一些选项卡的操作栏。

我想让滑动抽屉菜单在选项卡上方滑动,而不是在选项卡下面。

目前它是这个样子...

Sliding menu under action bar tabs

有什么想法可以实现吗?

注:我知道我可能会违反一些常规和UI模式,如果完全行不通,我会考虑替代方案。但是我想先让它起作用。

编辑:请参见Google Play Music应用程序的以下屏幕截图,它正好符合我的需求。 请查看@CommonsWare的答案,他确实同意我可能会违反惯例。但是鉴于Play Music应用程序,这可能并不是那么罕见。

Proper navigation with tabs sliding correctly


你是怎么做到让导航抽屉至少部分在内容上方的?对我来说,它总是在内容下面。 - pt123
@pt123:不太确定你的意思。当我使用ViewPager和PagerTabStrip时,一切都正常工作。请参考下面由CommonsWare标记为正确的答案。如果问题仍然存在,请建议您发布一个带有代码和截图的新问题。 - Archit
谢谢您的回复,但问题已经解决。 - pt123
我希望这可以解决你的问题。 请参考:https://dev59.com/PWAg5IYBdhLWcg3wSpPD - Denny Mathew
你可以在 https://dev59.com/zGQn5IYBdhLWcg3wmIAs#43817281 上看到我的解决方案,它完美地工作。 - Orlay Garcia Duconge
10个回答

22

您可以使用以下库来获取类似于Google Play音乐应用程序的导航模型。

  • ActionBarSherlock (github)
  • nested-fragments (github)
  • PagerSlidingTabStrip (github)
  • NavigationDrawer (Android开发者网站)
  • 最新的支持v4库

我已经在GitHub上创建了一个项目“带有选项卡条的抽屉导航示例”,请查看它。

以下是它的屏幕截图。

Navigation-drawer-page-sliding-tab-strip


谢谢Balaji!虽然我现在不需要立即使用这个,但是你提供的示例是否依赖于ActionBarSherlock?能否在没有它的情况下完成?只是确认一下。 - Archit
@archit 是的,这取决于ActionBarSherlock,但是由于谷歌发布了更新的支持库,因此可以在没有它的情况下开发项目。 - Balaji
@Balaji,如果不使用ActionBarSherlock,它该如何实现? - Sheharyar
@SheharyarNaseer,希望你知道谷歌的v7 appcompat库,这是你正在寻找的吗? - Balaji
@Balaji,我已经实现了这个UI,但是我遇到了一个问题,描述在这里。你能帮我吗? - AnujAroshA
显示剩余2条评论

11
有关如何完成此操作的任何想法?
请执行以下任一操作:
- 切换到除操作栏选项卡之外,例如使用 ViewPager 和带选项卡指示器(PagerTabStrip、TabPageIndicator 来自 ViewPageIndicator)。 - 查看现有的第三方抽屉实现是否尚未更新到新的 UI 标准。 - 分叉 DrawerLayout 并修改它以适应所需。 - 从头开始创建自己的导航抽屉。
我理解这可能会违反某些约定和 UI 模式。请参阅正确方式

考虑到上述设计确实违背了惯例(而我不想这样做),但我有理由这样做,其中滑动抽屉菜单充当顶级导航,而选项卡则是应用程序某一部分内的导航。 我不想强制用户必须向上一级才能访问顶级导航。是否有更好的导航方案建议? - Archit
到目前为止,我唯一看到实现滑动抽屉菜单和操作栏选项卡的地方是新的Google Play音乐应用程序(在“我的库”部分),它按预期工作,菜单在选项卡上方滑动,而非下方。 - Archit
1
@Archit:Google Play Music没有使用操作栏选项卡。它是在ViewPager上方使用了一个HorizontalScrollView和一个LinearLayout以及一组TextView小部件来实现“My Library”选项卡。我不确定Play Music中还有哪些地方使用了选项卡 - 这是我看到的唯一位置。如果您想采用Google Play Music的方法,我建议使用ViewPager和适当的指示器。 - CommonsWare
这就是材料设计中导航抽屉现在的工作方式,因此没有违反任何规则。 - Dmitry Zaytsev

3

3

我按照你在类似问题上发布的答案去做了。最终我选择了PagerTabStrip,它很好地满足了我的需求。但还是谢谢你提供的链接! - Archit

1
这可以在不使用第三方库的情况下完成。请查看Google的滑动选项卡示例。
     SlidingTabsBasic:   http://developer.android.com/samples/SlidingTabsBasic/project.html
     SlidingTabsColors:  http://developer.android.com/samples/SlidingTabsColors/project.html

此外,看看这个很棒的链接:http://manishkpr.webheavens.com/android-sliding-tabs-example/ 对我非常有效。 :)

0

我在抽屉的片段中使用了选项卡。 我通过添加

解决了这个问题。

getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

onDrawerClosed()getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);中,在onDrawerOpend()方法中。
希望这能帮到你。

0

ActionBar导航抽屉和SwipeTabs不能同时使用。您应该使用ActionBar来实现导航抽屉,简单的TabHosts来实现swipe tabs。您可以使用TabHost用于选项卡,并使用片段作为每个选项卡内部视图。通过viewpager使用片段以提供滚动/滑动效果。通过它们的方法将选项卡和viewpager相互连接。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TabHost
    android:id="@+id/tabHost"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <HorizontalScrollView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:fillViewport="true"
            android:scrollbars="none" >

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" >
            </TabWidget>
        </HorizontalScrollView>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <android.support.v4.view.ViewPager
                android:id="@+id/viewPager_home"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </FrameLayout>
    </LinearLayout>
</TabHost>


0

我通过在OnDrawerClosed和onDrawerOpened函数中设置navigationMode来实现了这个要求。这只是一个临时解决方案,因为选项卡实际上并不会立即消失。

  public void onDrawerClosed(View view) {
          getActionBar().setTitle(mTitle);
          if(getActionBar().getTabCount()>0) //Add tabs when the fragment has it
          getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);               
                        ...
                    }

   public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);
            getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);              
                    ..

                    }

如果你的代码片段中有一些带有制表符,而另一些没有,请不要忘记在没有制表符的片段的 onCreateView 方法中移除制表符。
 getActionBar().removeAllTabs();

这是一个有趣的技巧... 但是,为了更好地适应上面CommonsWare的答案,您可能仍然最好稍微改变一下设计。不过,这仍然是一个有趣的技巧! - Archit
没问题,但请删除制表符,我只想让菜单滑动到操作选项卡上方。 - Xenione
@Xenione 不确定您是否仍然有问题。无论如何,另一个完美的解决方案可以在以下链接中找到 https://dev59.com/S2Qn5IYBdhLWcg3wTVh0#26772874 :) - user2814778

0

我遇到了同样的问题,但我找到的唯一解决方案是在内部片段(而不是片段活动)中使用标签页。我不知道这是否是最佳解决方案,我遇到的唯一问题是为这些标签设置样式,除此之外,它完美地工作。


你可以尝试使用PagerTabStrip,这是我最终选择的。我不太确定你能重新设计多少PagerTabStrip,但它的效果相当不错。你可以获得所有漂亮的滑动视图,并且在它们上面轻点也可以正常工作。 - Archit

0

播放音乐不使用标准的ActionBar.Tab 您可以通过扩展HorizontalScrollView来实现自己的选项卡容器 并与ViewPager一起使用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接