本文内容

  • 环境
  • 项目结构
  • 演示一:ActionBar Tab 导航
  • 演示二:ActionBar Tab 带滑动导航

本文演示 Tab 导航。第一个演示,是基本的 Tab 导航,第二个是带滑动的 Tab 导航。

另外,个人觉得,通过本例能够知道,如何创建初始化 Fragment,并把 Fragment 放入“容器”中。容器既可以是 LinearLayout、RelativeLayout,也可以是 ViewGroup。这类似初始化 Web 应用程序页面的实现,困扰了我很久,不解决这个问题,无法自己写 Android APP。

Fragment 碎片,这个思想很好。它是 Android 3.0 新增的,有了 Fragment,就可以将 Activity 模块化。这就好像,现在的页面都用 div(层)的概念,我觉得,这大概借鉴了 photoshop 的 layer(图层)的理念。

下载 Demo

环境


  • Windows 2008 R2 64 位
  • Eclipse ADT V22.6.2,Android 4.4.2(API 19)
  • SAMSUNG GT-8618,Android OS 4.1.2

项目结构


图 1 项目结构                                                           图 2 主程序界面

如图 1 所示,唯一需要注意的是,DummiyFragment1 DummiyFragment2 虽然内容完全相同,但它们继承的类不同。DummiyFragment1 继承 android.app.Fragment,而 DummiyFragment2 继承 android.support.v4.Fragment

演示 ActionBar Tab 导航


图 3 Tab 导航

核心代码如下所示:

public class ActionBarTabNavTest extends Activity implements
        ActionBar.TabListener {
    private static final String SELECTED_ITEM = "selected_item";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tabnav);
        final ActionBar actionBar = getActionBar();
 
        // 设置ActionBar的导航方式:Tab导航
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
 
        // 依次添加3个Tab页,并为3个Tab标签添加事件监听器
        actionBar
                .addTab(actionBar.newTab().setText("第一页").setTabListener(this));
        actionBar
                .addTab(actionBar.newTab().setText("第二页").setTabListener(this));
        actionBar
                .addTab(actionBar.newTab().setText("第三页").setTabListener(this));
    }
 
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        if (savedInstanceState.containsKey(SELECTED_ITEM)) {
            // 选中前面保存的索引对应的Fragment页
            getActionBar().setSelectedNavigationItem(
                    savedInstanceState.getInt(SELECTED_ITEM));
        }
    }
 
    // 将当前选中的Fragment页的索引保存到Bundle中
    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt(SELECTED_ITEM, getActionBar()
                .getSelectedNavigationIndex());
    }
 
    @Override
    public void onTabUnselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }
 
    // 当指定Tab被选中时激发该方法
    @Override
    public void onTabSelected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
        // 创建一个新的Fragment对象
        Fragment fragment = new DummyFragment1();
        // 创建一个Bundle对象,用于向Fragment传入参数
        Bundle args = new Bundle();
        args.putInt(DummyFragment2.ARG_SECTION_NUMBER, tab.getPosition() + 1);
        // 向fragment传入参数
        fragment.setArguments(args);
        // 获取FragmentTransaction对象
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        // 使用fragment代替该Activity中的container组件
        ft.replace(R.id.container, fragment);
        // 提交事务
        ft.commit();
    }
 
    @Override
    public void onTabReselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

演示 ActionBar Tab 带滑动导航


图 4 Tab 滑动导航

核心代码如下所示:

public class ActionBarTabSwipeNavTest extends FragmentActivity implements
        ActionBar.TabListener {
    
    ViewPager viewPager;
    ActionBar actionBar;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tabswipenav);
        // 获取ActionBar对象
        actionBar = getActionBar();
        // 获取ViewPager
        viewPager = (ViewPager) findViewById(R.id.pager);
        // 创建一个FragmentPagerAdapter对象,该对象负责为ViewPager提供多个Fragment
        FragmentPagerAdapter pagerAdapter = new FragmentPagerAdapter(
                getSupportFragmentManager()) {
            // 获取第position位置的Fragment
            @Override
            public Fragment getItem(int position) {
                Fragment fragment = new DummyFragment2();
                Bundle args = new Bundle();
                args.putInt(DummyFragment2.ARG_SECTION_NUMBER, position + 1);
                fragment.setArguments(args);
                return fragment;
            }
 
            // 该方法的返回值i表明该Adapter总共包括多少个Fragment
            @Override
            public int getCount() {
                return 3;
            }
 
            // 该方法的返回值决定每个Fragment的标题
            @Override
            public CharSequence getPageTitle(int position) {
                switch (position) {
                case 0:
                    return "第一页";
                case 1:
                    return "第二页";
                case 2:
                    return "第三页";
                }
                return null;
            }
        };
        // 设置ActionBar使用Tab导航方式
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        // 遍历pagerAdapter对象所包含的全部Fragment。
        // 每个Fragment对应创建一个Tab标签
        for (int i = 0; i < pagerAdapter.getCount(); i++) {
            actionBar
                    .addTab(actionBar.newTab()
                            .setText(pagerAdapter.getPageTitle(i))
                            .setTabListener(this));
        }
        // 为ViewPager组件设置FragmentPagerAdapter
        viewPager.setAdapter(pagerAdapter); // ①
        // 为ViewPager组件绑定事件监听器
        viewPager
                .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    // 当ViewPager显示的Fragment发生改变时激发该方法
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });
    }
 
    @Override
    public void onTabUnselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }
 
    // 当指定Tab被选中时激发该方法
    @Override
    public void onTabSelected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
        viewPager.setCurrentItem(tab.getPosition()); // ②
    }
 
    @Override
    public void onTabReselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

下载 Demo

Android 原生 Android ActionBar Tab (滑动)导航的更多相关文章

  1. Android 原生 Android ActionBar

    本文内容 关于 ActionBar 必要条件 项目结构 环境 演示一:Action Bar 显示隐藏 演示二:Action Item 显示菜单选项 演示三:Action Home 启用"返回 ...

  2. Android之仿微信Tab滑动

    这个项目实现了以下的功能:有三个标签聊天.发现和通讯录,左右滑动下面的ViewPager可以切换不同的标签,且标签下面的蓝色条可以随着手指的滑动来实时滑动.另外,如果第二次滑动到“聊天”界面,可以在“ ...

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

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

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

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

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

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

  6. Android Actionbar Tab 导航模式

    Android Actionbar Tab 下图中,红色矩形圈起来的就是我们 ActionBar Tab,下面我们将一步一步的实现下图中的效果. 初次尝试 package com.example.it ...

  7. Android典型界面设计——ViewPage+Fragment实现区域顶部tab滑动切换

    一.问题描写叙述 本系列将结合案例应用,陆续向大家介绍一些Android典型界面的设计,首先说说tab导航,导航分为一层和两层(底部区块+区域内头部导航).主要实现方案有RadioGroup+View ...

  8. Android Training精要(一)ActionBar上级菜单导航图标

    Navigation Up(ActionBar中的上级菜单导航图标) 在android 4.0中,我们需要自己维护activity之间的父子关系. 导航图标ID为android.R.id.home @ ...

  9. 兼容 Android 4.4 透明状态栏与导航栏

    http://www.apkbus.com/Android-163388-1-1.html?_dsign=73d41229 android 系统自4.2 开始 UI 上就没多大改变,4.4 也只是增加 ...

随机推荐

  1. java从文件中读取数据然后插入到数据库表中

    实习工作中,完成了领导交给的任务,将搜集到的数据插入到数据库中,代码片段如下: static Connection getConnection() throws SQLException, IOExc ...

  2. 从.snk文件导出密钥

    先声明该文的实用性不强, 要产生一对密钥可以有更简单的方法.该文简单解释了.snk文件的格式,并给出了从中提取密钥的C#代码. .snk文件(Strong Name Key)也可以叫签名文件,它一般用 ...

  3. JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数

    本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...

  4. 无法上外网, ping网关ping不通的解决——arp命令

    转自:http://jingyan.baidu.com/article/3c48dd34873909e10be35894.html 转自:http://man.linuxde.net/arp 用来管理 ...

  5. javascript游戏引擎

    基于JavaScript开发的游戏是唯一一个能够跨桌面,Web和移动三种平台的.今天,本文向大家推荐一些非常棒的JavaScript游戏开发框架. AD:干货来了,不要等!WOT2015 北京站演讲P ...

  6. [Web 前端] MobX

    1. 介绍 1.1. 原理 React的render是 状态 转化为树状结构的渲染组件的方法 而MobX提供了一种存储,更新 状态 的方法 React 和 MobX都在优化着软件开发中相同的问题. R ...

  7. Dump dynamic object in LinqPad

      Just like: dynamic paper = MockPaper(); LINQPad.Extensions.Dump(paper); //paper.Dump(); Use LINQPa ...

  8. jpa命名规则 jpa使用sql语句 @Query

    关键字方法命名sql where字句 AndfindByNameAndPwdwhere name= ? and pwd =? OrfindByNameOrSexwhere name= ? or sex ...

  9. 突发奇想之:源码及文档,文档包括源码---xml格式的源码,文档源码合并;注释文档化,文档代码化;

    目前源码和文档一般都是分开的,我在想为什么 源码不就是最好的文档么? 但是一般源码都是文本text的,格式化需要人为统一规范,所以源码中的文档在现实中不是那么的易于实践. 而且 源码 不能包括图片.附 ...

  10. C++虚函数之接口 最简单的功能

    虚函数 ,接口,到底有什么用呢? 以前我都是在C++ 里面写C,只用到 简单的C++面对对象知识 #include<stdio.h> class IServerLogic{ virtual ...