Android Actionbar Tab

下图中,红色矩形圈起来的就是我们 ActionBar Tab,下面我们将一步一步的实现下图中的效果。

初次尝试

package com.example.it.studyactionbartab;

import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); String[] tabNames = {"收藏", "全部"}; //使用getSupportActionBar可以有更好的兼容性
ActionBar actionBar = this.getSupportActionBar();
//设置当前的导航模式
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); //添加Tab
for (String name : tabNames) {
actionBar.addTab(
actionBar.newTab()
.setText(name)
);
}
}
}

发现问题

上面的代码看起来已经没有异样了,我们来尝试运行,你就会发现是报错了。会出现一下的信息,ActionBar Tab 必须要有一个回调。

解决问题

我们回过头来看看我们的 Tab 还有哪些方法,看来也就是下图所矩形标注的这个方法像是回调函数,那么让我们来看看此方法的的说明。

Set the ActionBar.TabListener that will handle switching to and from this tab. All tabs must have a TabListener set before being added to the ActionBar.

设置一个 ActionBar.TabListener ,他将控制Tab的开关,所有的Tab必须具有 TabListener ,设置在Tab被添加到ActionBar之前。

该方法,不出意外应该就是我们报错的原因,下面让我们来实现它。

package com.example.it.studyactionbartab;

import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class MainActivity extends AppCompatActivity implements ActionBar.TabListener { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); String[] tabNames = {"收藏", "全部"}; //使用getSupportActionBar可以有更好的兼容性
ActionBar actionBar = this.getSupportActionBar();
//设置当前的导航模式为TAGS模式
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); /*
* 添加Tab
* Note: 必须要添加一个TabListener
* */
for (String name : tabNames) {
actionBar.addTab(
actionBar.newTab()
.setText(name)
.setTabListener(this) );
}
} /*
* 当选中TAB 时触发的事件
* */
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { } /*
* 当 Tab取消选中时触发的事件
* */
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { } /*
* 当重复选中TAB时候触发的事件
* */
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { }
}

完成功能

既然涉及到了多个界面,那么就到我们的Fragment登场了。只是一个Demo就没有复杂的功能,所以一切从简哈。

Note: 在这里 FragmentTransaction 不用提交,系统会自动的帮助我们提交,如果重复的提交就会,抛出异常。

/*
* 当选中TAB 时触发的事件
* */
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
Fragment fragment = null;
switch (String.valueOf(tab.getText())) {
case "收藏":
fragment = new FragmentCollect();
break;
case "全部":
fragment = new FragmentAll();
break;
}
ft.replace(R.id.activity_main, fragment);
// ft.commit();
}

可能遇到的Error

说明 FragmentTransaction 的commit方法重复执行了,在这个回调用我们不需要,进行手动 commit() 系统会自动帮助我们commit().

源码下载

https://git.oschina.net/ShareKnowledge/android_actionbar_tab

Android Actionbar Tab 导航模式的更多相关文章

  1. Android 原生 Android ActionBar Tab (滑动)导航

    本文内容 环境 项目结构 演示一:ActionBar Tab 导航 演示二:ActionBar Tab 带滑动导航 本文演示 Tab 导航.第一个演示,是基本的 Tab 导航,第二个是带滑动的 Tab ...

  2. Android ActionBar的Overlay模式如何不遮盖顶部内容的问题

    关于actionbar的overlay模式请参考 如何让android的actionbar浮动且透明 一文.这篇文章讲的是如何在这种模式下让actionbar不遮住顶部的内容. 这 一般是这样的场景, ...

  3. android改动tab 导航 指示器颜色

    我事实上想改动的上面的蓝色条条,改成红色. 这个问题实在是困扰我了太长时间.之前參照google的这个文章: https://developer.android.com/training/basics ...

  4. Android ActionBar

    ActionBar 在android3.0中就加入了,但是android3.0适用于平板电脑的,在手机不能使用.android 4.0之后也开始有AndroidBar.所以说要想使用androidBa ...

  5. Android ActionBar的基本用法

    一  说明android 3.0后出现, 在3.0之前称为Title Bar  显示位置在标题栏上可以显示应用程序的图标和activity的标题创建方式的和系统菜单相似, 区别在于: android: ...

  6. Android actionBar与Fragment结合使用Demo2

    上一篇文章介绍了ActionBar的使用,这里介绍ActionBar的还有一种用法.达到的效果和曾经的GroupActivity或TabHost是一样的,可作为导航来使用. 实现效果图: 源码: 布局 ...

  7. Android典型界面设计(6)——ActionBar Tab+ViewPager+Fagment实现滑动导航

    一.问题描述 在Android典型界面设计一文中,实现典型滑动导航界面,其实使用ActionBar 也可以轻松实现这一效果,甚至也可实现类似Android典型界面设计(3)的双导航效果.可见Actio ...

  8. Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPager

    action来实现tab标签 并跟fragment结合 因为要写新闻客户端这个tab导航是必须的 这里我写几个小练习,希望大家融会贯通. 1actionbar设置tab +fragment 布局是个l ...

  9. Android入门之ActionBar实现Tab导航

    效果图: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=&qu ...

随机推荐

  1. ECMAScript 6中的var,let,const

    var的变量提升 console.log(a); //输出undefined ; 他的实际执行顺序是: var a: console.log(a); a= 这就是var的变量提升 const命令的用法 ...

  2. 【译】第九篇 SQL Server代理了解作业和安全

    本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这一系列的上一篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本 ...

  3. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

  4. Vim 快捷键整理【转】

    转自:http://blog.csdn.net/ceven2010/article/details/7406341 一.移动光标 1.左移h.右移l.下移j.上移k 2.向下翻页ctrl + f,向上 ...

  5. select()函数用法三之poll函数

    poll是Linux中的字符设备驱动中有一个函数,Linux 2.5.44版本后被epoll取代,作用是把当前的文件指针挂到等待队列,和select实现功能差不多. poll()函数:这个函数是某些U ...

  6. 比特币pow算法介绍

    Proof Of Work 工作量证明 借鉴了 哈希现金(Hashcash)-1997年 英国密码学专家亚当.贝克(Adam Back) 用工作量证明系统解决了互联网垃圾邮件问题,它要求计算机在获得发 ...

  7. Nginx实现代理和用户验证

    1.下载Nginx 首先去官网http://nginx.org/en/download.html下载需要的版本即可,无需安装,只需要打开nginx.exe文件,nginx.exe的服务就开启了.打开h ...

  8. wpf设置某容器透明,而不应用到容器的子元素的方法

    以Border打比方: <Border.Background> <SolidColorBrush Opacity="0.4" Color="Black& ...

  9. django(1)安装及配置

    1.版本选择 Django 1.5.x 支持 Python 2.6.5 Python 2.7, Python 3.2 和 3.3. Django 1.6.x 支持 Python 2.6.X, 2.7. ...

  10. C++两个类相互包含引用的问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请 ...