我已经开始使用ActionBarActivity
更改为AppCompatActivity
了,但我也开始使用Toolbar
而非标准ActionBar
}。
但是,在我的一个具有滑动标签类型布局的活动中,以下行似乎已被弃用:
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
虽然我已经在Stack Overflow上查看了其他一些有关此问题的答案,但是有没有内置的方法来更改它以支持使用Toolbar
。如果是这样,你能解释一下我将如何改变它吗?如何更改onTabSelected
等已弃用的方法?
另外,我注意到Google Play音乐应用看起来像标签下方的扩展工具栏/部分(请参阅this image for what I am talking about)。我怎么能有这种类型的布局?
提前致谢。
答案 0 :(得分:14)
经过几天的大量研究,并通过GitHub查看,我终于设法解决了我的问题。
值得庆幸的是,自从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进行水平分页,则可以直接从PagerAdapter的getPageTitle()创建标签,然后使用{{1}将两者连接在一起}}。这可确保选项卡选择事件更新ViewPager,页面更改将更新选定的选项卡。
首先,我从GitHub上的Google的I / O会议应用程序下载了SlidingTabLayout.java
和SlidingTabStrip.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);
来说是可靠的。
然后我设置了Toolbar
和ViewPager
部分:
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}}。如果有任何不清楚的地方,请随时在下面发表评论。