对于初学者来说,从零构建一个app是走向android开发的必经之路。熟悉android 5.0特性的朋友对android常见的导航栏不会陌生,效果图如下:

Screenshot_2016-12-03-23-23-07-633_com.rocklee.mddemo.png

这是android 5.0很基础的一个设计,从上到下分别使用了三个控件:toolbar、tabLayout、viewpager。

控件简介

1. toolbar

toolbar是谷歌于android 5.0版本提出的官方导航栏,属性于功能大致与actionbar一致,优点则是自定义属性更强,可以随便放置在屏幕任何位置、可以修改许多属性,自由度较高。

2. tabLayout

tabLayout是谷歌于2015年google大会上发布的新的android support design中的一款,代替之前民间盛行的tabPageIndicator,与viewpager、fragment(或者view)搭配使用,实现点击屏幕标签或左右滑动可以切换页面的效果。

3. viewpager

viewpager同样是谷歌官方提供的控件,它相当于一个容器,储存fragment或者view,通过左右滑动的方式将容器中的页面进行切换,常用于app首页的欢迎页与滚动栏。

布局文件

代码如下,从上到下依次为toolbar、tabLayout、viewpager,静态属性较少,只有toolbar的一个阴影高度elevation,个人喜欢动态设置控件属性。

  

初始化控件

在activity中,首先得隐藏actionbar,否则会显示两个导航栏:

    supportRequestWindowFeature(Window.FEATURE_NO_TITLE);    setContentView(R.layout.activity_main);

注意点:在setContentView之前隐藏actionbar,因为我们得在activity布局之前隐藏掉它,否则加载后这句代码便是无效的。另外targetSDK<21的情况下,使用requesWindowFeature方法,targetSDK>=21的情况下,使用supportRequestWindowFeature方法。否则会无效果。

首先,家常便饭:findviewbyId,在布局文件中找到相应的控件:

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);    ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);

紧接着,便可以直接给toolbar设置属性了:

    /**     * 初始化Toolbar     * */    toolbar.setLogo(R.mipmap.ic_launcher);    toolbar.setNavigationIcon(R.mipmap.ic_launcher);    toolbar.setTitle("Material Design");    toolbar.setSubtitle("Google");    toolbar.inflateMenu(R.menu.toolbar_menu);    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {        @Override        public boolean onMenuItemClick(MenuItem item) {            switch (item.getItemId()) {                case R.id.add:                    break;                case R.id.camera:                    break;                case R.id.share:                    break;                default:                    break;            }            return true;        }    });

toolbar不外乎logo、navigationIcon、title、subtitle、menu等几个属性,见下图图解:


navigationIcon一般可设置点击事情,用作button的功能
title和subtitle就是主、副标题了。需要着重介绍的是menu。
menu是toolbar发挥真正作用的地方,它是toolbar的功能按键栏,常用的功能可设置在上面,首先在res中创建一个menu文件:

  <?xml version="1.0" encoding="utf-8"?>

然后在toolbar中加载这个menu(inflateMenu方法),并设置相应的点击事件(setOnMenuItemClickListener方法)
另外,如果你想修改标题和子标题的字体大小、颜色等,可以调用 setTitleTextColor 、 setTitleTextAppearance 、 setSubtitleTextColor 、 setSubtitleTextAppearance
这些APi

紧接着设置viewpager与tablayout属性

   /**     * 初始化viewpager和tabLayout     */    List viewList = new ArrayList<>();    List titleList = new ArrayList<>();    titleList.add("页面1");    titleList.add("页面2");    titleList.add("页面3");    titleList.add("页面4");    titleList.add("页面5");    LayoutInflater inflater = LayoutInflater.from(this);    View tab01 = inflater.inflate(R.layout.tab01, null);    View tab02 = inflater.inflate(R.layout.tab02, null);    View tab03 = inflater.inflate(R.layout.tab03, null);    View tab04 = inflater.inflate(R.layout.tab04, null);    View tab05 = inflater.inflate(R.layout.tab05, null);    viewList.add(tab01);    viewList.add(tab02);    viewList.add(tab03);    viewList.add(tab04);    viewList.add(tab05);    ViewPagerAdapter viewPagerAdapter=new ViewPagerAdapter(viewList,titleList);    viewPager.setAdapter(viewPagerAdapter);    tabLayout.setupWithViewPager(viewPager);

本例中使用的是用viewpager加载五个view,当然也可以加载五个fragment,根据app实际需要来进行选择,使用view的话优点就是不用担心fragment的各种坑,缺点则是在activity承担了大量的逻辑工作,不便于维护与更新,app功能只能做小而美;相反,一个大型的app则使用多个fragment则优势比较明显。

viewpager的使用方法中比较关键的就是adapter,因为viewpager是一个容器,我们把view看作数据的话,我们则必须有一个adapter将数据有顺序有调理地放入我们的容器中,这时我们需要新建一个类继承自pagerAdapter,代码如下:

package com.rocklee.mddemo;import android.support.v4.view.PagerAdapter;import android.view.View;import android.view.ViewGroup;import java.util.List;/** * Created by lwh on 2016/12/3. */public class ViewPagerAdapter extends PagerAdapter {private List viewList;private List titleList;public ViewPagerAdapter(List viewList,List titleList) {    this.viewList=viewList;    this.titleList=titleList;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {    container.removeView(viewList.get(position));}@Overridepublic Object instantiateItem(ViewGroup container, int position) {    container.addView(viewList.get(position));    return viewList.get(position);}@Overridepublic CharSequence getPageTitle(int position) {    return titleList.get(position);}@Overridepublic int getCount() {    return titleList.size();}@Overridepublic boolean isViewFromObject(View view, Object object) {    return view==object;}}

在该类中,必须复写instantiateItem、destroyItem、getCount、isViewFromObject这四个方法。他们分别的功能是将对应位置的view显示出来、不使用该view时将其移出、获取总共的view的数目、确保view与对应key对应上。

另外与tablayout搭配使用时必须复写getPageTitle这一方法,在获取adapter实例时将title传入,
在getPageTitle方法中返回对应位置的title,这样便可以让adapter知道title与view的对应的关系。

最后直接用一句代码 tabLayout.setupWithViewPager(viewPager);即可很方便的将tabLayout与viewpager搭配起来。

更多相关文章

  1. 《第一行代码》学习笔记 第 3 章
  2. Android(安卓)ViewPager轮播图
  3. android ListView 点击无响应
  4. Layout_weight的特性
  5. 安卓入门.控件样式
  6. Android(安卓)5.0系统 style 默认窗口控件颜色值设置
  7. Android(安卓)横屏启动activity,点击屏幕的单击、双击和长按事件
  8. android(8) ViewPager页面滑动切换
  9. 横屏启动activity,点击屏幕的单击、双击和长按事件

随机推荐

  1. Android(安卓)Studio配置Flutter遇到的问
  2. Android(安卓)intent消息通知机制
  3. Android(安卓)实现记住用户名和密码的功
  4. Android入门
  5. Google 发布 Android(安卓)Design 网站
  6. 半瓶水Android应用开发专栏――android基
  7. 重构博客园Android(安卓)App
  8. Android引路蜂地图开发示例:概述
  9. android 自定义带关闭按钮的dialog
  10. 定制android设备启动后进入的初始界面