使用工具栏滑动标签

时间:2015-04-25 17:13:14

标签: android android-layout android-5.0-lollipop android-tabs android-toolbar

我已经开始使用ActionBarActivity更改为AppCompatActivity了,但我也开始使用Toolbar而非标准ActionBar }。

但是,在我的一个具有滑动标签类型布局的活动中,以下行似乎已被弃用:

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

虽然我已经在Stack Overflow上查看了其他一些有关此问题的答案,但是有没有内置的方法来更改它以支持使用Toolbar。如果是这样,你能解释一下我将如何改变它吗?如何更改onTabSelected等已弃用的方法?

另外,我注意到Google Play音乐应用看起来像标签下方的扩展工具栏/部分(请参阅this image for what I am talking about)。我怎么能有这种类型的布局?

提前致谢。

1 个答案:

答案 0 :(得分:14)

经过几天的大量研究,并通过GitHub查看,我终于设法解决了我的问题。

使用AppCompatActivity将ActionBar选项卡更新为工具栏选项卡的步骤:

更新:2015年5月29日星期五之后:

值得庆幸的是,自从Google I / O 2015中宣布 Android设计支持库以来,使用TabLayout Toolbar变得更加简单。
我们不再需要下载自定义视图类,这是Google很久以前应该做的事情。

来自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,页面更改将更新选定的选项卡。

在Google I / O 2015之前:

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

接下来,我编辑了我的活动布局setupWithViewPager(),看起来有点像这样:

.xml

引用<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.mycompany.myapp.MyActivity" > <!-- This is the Toolbar with the tabs underneath --> <LinearLayout android:id="@+id/detail_headerBar" style="@style/HeaderBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include android:id="@+id/detail_toolbar" layout="@layout/toolbar" /> <com.mycompany.myapp.view.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 I had used before) and it would be responsible for the swiping to change layouts --> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/detail_headerBar" android:layout_above="@+id/detail_adView" /> <!-- I also had an AdView in my layout, but this is not necessary for creating tab layouts --> <com.google.android.gms.ads.AdView android:id="@+id/detail_adView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" ads:adSize="SMART_BANNER" ads:adUnitId="@string/banner_ad_unit_id" > </com.google.android.gms.ads.AdView> </RelativeLayout> Toolbar)的行引用了以下布局(对于那些还不确定如何使用<include android:id="@+id/detail_toolbar" layout="@layout/toolbar" />的人):

Toolbar

在上面的两个<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_height="wrap_content" android:layout_width="match_parent" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 布局文件中,.xml指的是我的应用的主要颜色(我在一个样式中定义)。

此外,在第一个布局中,我提到的?attr/colorPrimary样式引用了以下内容:

@style/HeaderBar

在我开始使用Java设置布局之前,我必须确保更改<style name="HeaderBar"> <item name="android:background">?colorPrimary</item> <item name="android:elevation">4dp</item> <!-- You may have to override this in a v21 version of this file --> </style> SlidingTabLayout.java中与其放置位置相对应的包名称。就我而言,我在这两个文件中都使用了SlidingTabStrip.java

现在,在我的package com.mycompany.myapp.view;(正在扩展Activity)中,我首先在AppCompatActivity方法中添加了以下内容:

onCreate

这对于显示Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar); setSupportActionBar(toolbar); 来说是可靠的。

然后我设置了ToolbarViewPager部分:

SlidingTabLayout

颜色&#39; 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); &#39;是我在tab_line中声明的颜色,它是标签线指示符的颜色。另请注意,上面的变量是我在此活动中先前定义的全局变量:

color.xml

最后要做的是设置我称之为预告片的SlidingTabLayout mSlidingTabLayout; ViewPager mViewPager; 。这将负责根据选择的选项卡更改页面。我使用了以下内容:

ViewPagerAdapter

我希望对于那些遇到同样麻烦的人来说,当我从public class ViewPagerAdapter extends FragmentPagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { // Returns the number of tabs return 3; } @Override public Fragment getItem(int position) { // Returns a new instance of the fragment switch (position) { case 0: return new FragmentOne(); case 1: return new FragmentTwo(); case 2: return new FragmentThree(); } return null; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.title_section1).toUpperCase(l); case 1: return getString(R.string.title_section2).toUpperCase(l); case 2: return getString(R.string.title_section3).toUpperCase(l); } return null; } } 切换到ActionBarActivity并开始使用AppCompatActivity代替{{}时,这是一个足够彻底的答案1}}。如果有任何不清楚的地方,请随时在下面发表评论。