Android 5.0(L) ToolBar(替代ActionBar) 实战

Posted 萧文翰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 5.0(L) ToolBar(替代ActionBar) 实战相关的知识,希望对你有一定的参考价值。

上一次我们说到ToolBar的创建,这次我们来讨论一下ToolBar结合ViewPager实现类似微信的左右滑屏多个界面的效果。

要实现滑屏,首先我们要到android开发者官网去下载一个示例代码,它封装了Viewpager和Tab配合切换页卡的方法。当然,我们也可以自己来实现,为了节约时间成本,就直接拿来用了。如果在官网找不到或者无奈被墙,可以到这里下载:http://download.csdn.net/detail/wh1990xiao2005/8105345

把下载好的工具类复制到项目指定的包内,我是在之前的项目中创建了view专用的包,并将这两个类复制了进去。

这里要注意,复制进去之后有可能会报错,因为包名不符,只需把package包名修改为自己的类所在包名即可。

打开布局文件,在上次Toolbar的声明下面添加SlidingTabLayout和ViewPager控件,下面放上示例:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res/com.xwh.toolbardemo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.xwh.toolbardemo.MainActivity" >

    <android.support.v7.widget.Toolbar
        android:id="@+id/demo_toolbar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        app:title="@string/hello_world" />

    <com.xwh.toolbardemo.view.SlidingTabLayout
        android:id="@+id/demo_tab"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/demo_toolbar" />

    <android.support.v4.view.ViewPager
        android:id="@+id/demo_vp"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/demo_tab" />

</RelativeLayout>

下面打开MainActivity.java,实例化相关的对象,包括ToolBar,这里不多说废话了,直接上代码:

<span style="white-space:pre">	</span>// 初始化控件
	private void findView() 
		toolbar = (Toolbar) findViewById(R.id.demo_toolbar);
		slidingTabLayout = (SlidingTabLayout) findViewById(R.id.demo_tab);
		viewPager = (ViewPager) findViewById(R.id.demo_vp);
	
ToolBar不用多说,SlidingTabLayout实际上是上方的Tab视图,而ViewPager是页卡的容器,而页卡是稍后添加的多个Fragment。

下面我们来写三个Layout的xml文件和相关的三个Fragment的Java代码,分别代表三个页卡。

第一个页卡随意放置一个图片,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:contentDescription="@string/app_name"
    android:src="@drawable/ic_launcher" >

</ImageView>
第二个页卡放置一个模拟时钟,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<AnalogClock xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</AnalogClock>
第三个页卡放置一个数字时钟,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<DigitalClock xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:textSize="40sp" >
</DigitalClock>
相应的,创建三个Fragment的Java代码文件,这里只列出其中一个文件的程序清单,另外两个按此自行编写:

package com.xwh.toolbardemo.fragment;

import com.xwh.toolbardemo.R;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment_Tab_1 extends Fragment 
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) 
		return inflater.inflate(R.layout.fragment_tab_1, container, false);
	

下面我们还需一个适配器(Adapter),用于将这三个Fragment适配到ViewPager之上,下面列出适配器的Java程序代码清单:

package com.xwh.toolbardemo.adapter;

import java.util.ArrayList;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class ViewPager_Adapter extends FragmentPagerAdapter 

	private ArrayList<Fragment> fragments;

	public ViewPager_Adapter(FragmentManager fm, ArrayList<Fragment> fragments) 
		super(fm);
		this.fragments = fragments;
	

	@Override
	public Fragment getItem(int pos) 
		return fragments.get(pos);
	

	@Override
	public int getCount() 
		return fragments.size();
	

	@Override
	public CharSequence getPageTitle(int position) 
		return "Tab_" + position;
	

这里需要注意:下方的getPageTitle()方法是必要的,他用于相应Tab名称的显示。

到此,我的程序架构如下图所示:


接下来,我们将三个Fragment通过Adapter适配到ViewPager上,这一过程,我们只对MainActivity做操作。完整代码如下所示:

package com.xwh.toolbardemo;

import java.util.ArrayList;

import com.xwh.toolbardemo.adapter.ViewPager_Adapter;
import com.xwh.toolbardemo.fragment.Fragment_Tab_1;
import com.xwh.toolbardemo.fragment.Fragment_Tab_2;
import com.xwh.toolbardemo.fragment.Fragment_Tab_3;
import com.xwh.toolbardemo.view.SlidingTabLayout;

import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.os.Bundle;

public class MainActivity extends ActionBarActivity 

	private Toolbar toolbar;
	private SlidingTabLayout slidingTabLayout;
	private ViewPager viewPager;

	private ArrayList<Fragment> fragments;
	private ViewPager_Adapter viewPager_Adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) 
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findView();
	

	// 初始化控件
	private void findView() 
		// 实例化控件
		toolbar = (Toolbar) findViewById(R.id.demo_toolbar);
		slidingTabLayout = (SlidingTabLayout) findViewById(R.id.demo_tab);
		viewPager = (ViewPager) findViewById(R.id.demo_vp);
		// 设置ViewPager
		fragments = new ArrayList<Fragment>();
		fragments.add(new Fragment_Tab_1());
		fragments.add(new Fragment_Tab_2());
		fragments.add(new Fragment_Tab_3());
		viewPager_Adapter = new ViewPager_Adapter(getSupportFragmentManager(),
				fragments);
		viewPager.setOffscreenPageLimit(fragments.size());
		viewPager.setAdapter(viewPager_Adapter);
		// 设置SlidingTab
		slidingTabLayout.setViewPager(viewPager);
	

到此,我们可以Ctrl+F11运行看效果了。如果不出意外的话,会是下面的效果:






仔细观察可以发现,ToolBar比ActionBar更好的一点在于上方Tab的选中状态,是根据滑动程度来的,而传统的ActionBar略显生硬。

第二篇Toolbar文章到此为止,在下一篇里,我们将集中介绍Menu的使用以及关于Toolbar的更多功能,欢迎关注!


以上是关于Android 5.0(L) ToolBar(替代ActionBar) 实战的主要内容,如果未能解决你的问题,请参考以下文章

Android 5.0(L) ToolBar(替代ActionBar) 实战

Toolbar使用

android:Toolbar用法探析

Android ToolBar 使用完全解析

android ——Toolbar

Android 5.0 (API 21) 中 AudioManager.setRingerMode() 的替代方案