使用Tab与新ToolBar(AppCompat v7-21)

时间:2014-10-24 01:23:13

标签: android tabs android-support-library android-appcompat android-actionbar-compat

我正在使用带有标签的SupportActionBar和一个自定义的ActionBar主题(使用http://jgilfelt.github.io/android-actionbarstylegenerator/创建),仅在用户展开搜索视图时显示标签。

public boolean onMenuItemActionExpand(MenuItem item) {
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        return true;
    }
}

我从ActionBar迁移到工具栏。我的应用程序确实需要支持API 9。

有没有办法使用此代码添加标签?:

Toolbar toolbar = (Toolbar) findViewById(R.id.new_actionbar);
setSupportActionBar(toolbar);
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

如果可能,我如何使用自定义主题或样式工具栏?

文档说这已被弃用,建议使用不同类型的导航。 但我不知道Android中具有相同功能的任何其他组件。

一些帮助?

2 个答案:

答案 0 :(得分:156)

使用API​​ 21,方法setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)deprecated

您可以使用其他模式。例如,您可以使用在googleio14中看到的相同示例。

它使用与SlidingTabLayout一起使用的ViewPager

Here you can find the example(在你的sdk示例中)

您可以在此处找到Google io14示例:

更新29/05/2015

现在使用新的设计支持库,您可以使用新的TabLayout

只需将此依赖项添加到build.gradle

即可
compile 'com.android.support:design:22.2.0'

代码非常简单:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

要实现材料设计的许多功能,您应该在a。中使用它 CoordinatorLayoutAppBarLayout

这样的事情:

 <android.support.design.widget.CoordinatorLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         android:layout_width="match_parent"
         android:layout_height="match_parent">


     <android.support.design.widget.AppBarLayout
             android:layout_height="wrap_content"
             android:layout_width="match_parent">

         <android.support.v7.widget.Toolbar
                 ...
                 app:layout_scrollFlags="scroll|enterAlways"/>

         <android.support.design.widget.TabLayout
                 ...
                 app:layout_scrollFlags="scroll|enterAlways"/>

     </android.support.design.widget.AppBarLayout>

     <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

 </android.support.design.widget.CoordinatorLayout>

答案 1 :(得分:14)

虽然现在回答这个问题可能有点晚了,但我意识到我写了an answer on a similar question,其中包括使用设计支持库和Google I / O之前。

我已经包含了以下基本部分:

自{em> Android设计支持库宣布后,TabLayoutToolbar的使用变得更加简单,这意味着我们不再需要下载自定义视图类。

来自Android Developers' Blogspot post on the Android Design Support Library

  

标签

     

通过tabs在您的应用中的不同视图之间切换并不是材料设计的新概念,它们同样在家作为top level navigation pattern或在您的应用中组织不同的内容分组(例如,不同类型的音乐)。

     

     

设计库的TabLayout实现了两个固定选项卡,其中视图的宽度在所有选项卡之间平均分配,以及可滚动选项卡,其中选项卡的大小不均匀并且可以水平滚动。标签可以通过编程方式添加:

     

TabLayout tabLayout = ...;
  tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));

     

但是,如果您在标签之间使用ViewPager进行水平分页,则可以直接从PagerAdaptergetPageTitle()创建标签,然后使用{{1}将两者连接在一起}}。这可确保选项卡选择事件更新ViewPager,页面更改将更新选定的选项卡。

如果您不使用设计支持库,则需要执行以下操作:

1。从GitHub上的Google I / O会议应用下载SlidingTabLayout.javaSlidingTabStrip.java个文件。这些是将在选项卡布局中使用的视图,因此我创建了一个包含其他Java活动的文件夹,名为“view”并将它们放在那里。

2。编辑您的布局以包含setupWithViewPager()

SlidingTabLayout

引用<LinearLayout android:orientation="vertical" ... > <!-- This is the Toolbar with the tabs underneath --> <LinearLayout android:orientation="vertical" ... > <include android:id="@+id/my_toolbar" layout="@layout/toolbar" /> <com.mycompany.myapp.SlidingTabLayout android:id="@+id/sliding_tabs" android:background="?attr/colorPrimary" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <!-- This is the ViewPager (which you already should have if you have used tabs before) --> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="wrap_content" /> ... </LinearLayout> Toolbar)的行引用了我用来制作<include android:id="@+id/detail_toolbar" layout="@layout/toolbar" />的另一个XML文件。

3。更改ToolbarSlidingTabLayout.java中与其所在位置对应的包名称。就我而言,我使用类似于SlidingTabStrip.java的内容来处理这两个文件。如您正在使用的IDE所述,组织导入并添加任何必要的内容。

4。package com.mycompany.myapp.view;(正在扩展Activity)中,使用AppCompatActivity方法设置Toolbar

onCreate

5. 设置Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar); setSupportActionBar(toolbar); ViewPager部分:

SlidingTabLayout

颜色“mViewPager = (ViewPager) findViewById(R.id.view_pager); mViewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager())); mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs); mSlidingTabLayout.setSelectedIndicatorColors(getResources().getColor(R.color.tab_line)); mSlidingTabLayout.setDistributeEvenly(true); mSlidingTabLayout.setViewPager(mViewPager); ”是我在tab_line中声明的颜色,它将是标签行指示符的颜色。另请注意,上面的变量是我在此活动中先前定义的全局变量:

color.xml

6。最后,设置我之前调用过的SlidingTabLayout mSlidingTabLayout; ViewPager mViewPager; 。这将负责根据选择的选项卡更改页面。我使用了以下代码:

ViewPagerAdapter

正如我上面提到的,这些解决方案的更多细节可以在another question I answered, about using Sliding Tabs with the Toolbar上找到。