使用Tab和新的工具栏(AppCompat v7-21)
我正在使用支持ActionBar标签和使用自定义ActionBar主题(使用http://jgilfelt.github.io/android-actionbarstylegenerator/创build),仅在用户展开search视图时才显示选项卡。
public boolean onMenuItemActionExpand(MenuItem item) { actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); return true; } }
我从ActionBar迁移到ToolBar。 我的应用程序确实需要支持api 9。
有没有办法使用它?
Toolbar toolbar = (Toolbar) findViewById(R.id.new_actionbar); setSupportActionBar(toolbar); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
如果可能,如何使用我的自定义主题或样式工具栏?
文档说这是不赞成的,并build议使用其他types的导航。 但我不知道android中的其他组件具有相同的function。
一些帮助?
通过API 21, 不推荐使用 setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)
方法。
你可以使用不同的模式。 例如,您可以使用您可以在googleio14中看到的相同示例。
它使用与SlidingTabLayout
一起使用的ViewPager
。
在这里你可以find这个例子 (这是你的SDK例子)
在这里你可以findGoogle io14的例子:
-
布局
-
Java的
更新29/05/2015
现在您可以使用新的devise支持库来使用新的TabLayout 。
只要添加这个依赖到你的build.gradle
compile 'com.android.support:design:22.2.0'
代码非常简单:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager);
要实现许多材质devise的function,您应该在CoordinatorLayout和AppBarLayout中使用它。
像这样的东西:
<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>
虽然现在回答这个问题可能有点晚,但是我意识到我已经写了一个类似的问题的答案,它涵盖了使用devise支持库和Google I / O之前的内容。
我已经包含了下面的基本部分:
自从发布Androiddevise支持库以来,使用带Toolbar
的TabLayout
就变得简单多了,这意味着我们不再需要下载自定义视图类。
来自Androiddevise支持库上的Android开发者的Blogspotpost :
标签 :
通过制表符切换应用程序中的不同视图对于材质devise来说并不是一个新概念,它们同样在家中作为顶级导航模式,或者用于在应用程序中组织不同types的内容(比如不同types的音乐)。
devise库的TabLayout实现了两个固定的选项卡,其中视图的宽度在所有选项卡之间平均分配,以及可滚动选项卡,其中选项卡不是统一大小,并且可以水平滚动。 选项卡可以通过编程添加:
TabLayout tabLayout = ...;
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
但是,如果您使用ViewPager在选项卡之间进行水平分页,则可以直接从PagerAdapter的getPageTitle()创build选项卡,然后使用
setupWithViewPager()
将它们连接在一起。 这可以确保选项卡select事件更新ViewPager和页面更改更新选定的选项卡。
如果您不使用devise支持库,则需要执行以下操作:
1.从GitHub的Google I / O会议应用程序下载SlidingTabLayout.java
和SlidingTabStrip.java
文件。 这些将是在标签布局中使用的视图,所以我创build了一个名为“视图”的其他Java活动的文件夹,并将它们放在那里。
2.编辑您的布局以包含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" />
)的行引用了另一个用于创buildToolbar
XML文件。
3.更改SlidingTabLayout.java
和SlidingTabStrip.java
与其放置位置相对应的包名称。 在我的情况下,我用了类似的东西: package com.mycompany.myapp.view;
为这两个文件。 按照您所使用的IDE的说明,组织导入并添加任何必要的内容。
4.在您的Activity
(扩展AppCompatActivity
)中,在onCreate
方法中设置Toolbar
:
Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar); setSupportActionBar(toolbar);
5.设置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
中声明的一种颜色,它是制表符行指示符的颜色。 还要注意,上面的variables是我在本次活动中定义的全局variables:
SlidingTabLayout mSlidingTabLayout; ViewPager mViewPager;
6.最后,设置我之前调用过的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; } }
正如我上面提到的,这些解决scheme的更多细节可以在我回答的另一个问题上提供,关于在工具栏中使用滑动选项卡 。