使用ActionBar实现Tab导航
ActionBar还有常用的功能,实现Tab导航。ActionBar在顶端生成多个Tab标签,当用户单击点击某个Tab标签时,系统根据用户点击事件导航指定Tab页面。
为了使用ActionBar实现Tab导航,按如下步骤进行即可。
①调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法设置使用Tab导航方式。
②调用ActionBar的addTab()方法添加多个Tab标签,并为每个Tab标签添加事件监听器。
实际项目中为了更好的展现Tab导航效果,ActionBar通常会与Fragment结合使用,因此这里先简单介绍Fragment的用法。
Fragment是Android 3.0新增的重要API,Fragment相当于Activity片段(Fragment本来就是片段的意思),我们通常使用单独的Activity组合多个Fragment,这样既可在一个Activity创建多个用户界面。除此之外,也可让多个Activity复用同一个Fragment。总之,Fragment相当于Activity的模块化区域。
Fragment有自己的生命周期,它也可以接收、处理属于它自身的事件,并允许Activity运行期间动态地添加、删除Fragement。
Fragement允许定义自己的布局,也可通过生命周期回调方法定义自己的行为,这一点Fragment非常像Activity。
与开发Activity类似的是,开发者自定义的Fragment也需要继承Fragment,并重写它的生命周期方法,通常会重写Fragment的onCreateView()生命周期方法。
实例:ActionBar结合Fragment实现Tab导航
该实例的界面布局文件非常简单,该布局文件中只定义了一个简单的容器,该容器甚至没有太多要求,既可使用LinearLayout,也可使用RelativeLayout......甚至是普通ViewGroup即可,该容器只是用于盛装Fragment。该实例的界面布局文件如下。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</LinearLayout>
上面的界面布局文件只是定义了一个LinearLayout作为容器,接下来Activity将会使用该容器动态盛装Fragment。下面是该Activity的代码。
package org.crazyit.helloworld; import android.os.Bundle;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.view.Menu; public class ActionBar_TabNav extends Activity implements TabListener { private static final String SELECTED_ITEM="selected_item";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.action_bar__tab_nav);
final ActionBar actionBar=getActionBar();
//设置ActionBar的导航方式:Tab导航
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//依次添加三个Tab页,并为三个Tab标签添加事件监听器
actionBar.addTab(actionBar.newTab().setText("第一页").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("第二页").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("第三页").setTabListener(this));
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.action_bar__tab_nav, menu);
return true;
} @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) { if(savedInstanceState.containsKey(SELECTED_ITEM))
{
//选中前面的索引对应的Fragment页
getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(SELECTED_ITEM)); }
} @Override
protected void onSaveInstanceState(Bundle outState) {
//将当前选中的Fragment页的索引保存到Bundle中
outState.putInt(SELECTED_ITEM, getActionBar().getSelectedNavigationIndex()); } @Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub } @Override
public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) {
// TODO Auto-generated method stub
//创建一个新的Fragment对象
Fragment fragment=new DummyFragment();
//创建一个Bundle对象,用于向Fragment传入参数
Bundle args=new Bundle();
args.putInt(DummyFragment.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 onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub } }
上面的第一段粗体字代码设置ActionBar使用Tab导航,为该ActionBar添加了三Tab标签,并为每个Tab标签都设置了事件监听器。
当用户单击ActionBar的指定Tab标签时,系统将会激发该监听器的onTabSelected()方法,因此上面的第二段粗体字代码实现了onTabSelected()方法,并在该方法中根据用户选中的Tab标签替换新的Fragment。
上面的实例用到了一个DummyFragment,这是一个简单的Fragemnt,它只是显示一个简单的TextView。下面是该DummyFragment的代码。
package org.crazyit.helloworld; import android.app.Fragment;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; public class DummyFragment extends Fragment {
public static final String ARG_SECTION_NUMBER="section_number"; @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
TextView textView=new TextView(getActivity());
textView.setGravity(Gravity.START);
//获取创建该Fragment时传入的参数Bundle
Bundle args=getArguments();
//设置TextView显示的文本
textView.setText(args.getInt(ARG_SECTION_NUMBER)+"");
textView.setTextSize(30);
//返回TextView
return textView;
// TODO Auto-generated method stub
//return super.onCreateView(inflater, container, savedInstanceState);
} }
运行该实例看到如图所示效果。
使用ActionBar实现Tab导航的更多相关文章
- Android入门之ActionBar实现Tab导航
效果图: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=&qu ...
- 使用ActionBar实现Tab导航(快速生成Tab样式)
效果如图: MainActivity.java具体实现: package com.rainmer.actionbartab; import android.app.ActionBar; import ...
- Android SlidingTabLayout的使用--替代ActionBar的Tab导航
最近在使用ActionBar的时候,如果使用的是最新版V7包或者最新的SDK平台,就会发现 ActionBar的导航功能已经不建议使用了.主要的原因是ActionBar自带Tab导航自定义性差(只能通 ...
- Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPager
action来实现tab标签 并跟fragment结合 因为要写新闻客户端这个tab导航是必须的 这里我写几个小练习,希望大家融会贯通. 1actionbar设置tab +fragment 布局是个l ...
- Android源码:(一) 安卓2.1到4.4操作系统通用的Actionbar实现的tab导航例子。
说一下我在完成这个例子之前的尝试吧 一,修改“actionbarsherlock”的导航例子.我在实现这个例子之前,尝试过“actionbarsherlock”,修改它的一个tab导航的例子,修改成功 ...
- 微信小程序小技巧系列《一》幻灯片,tab导航切换
作者:gou-tian 来自:github 幻灯片 使用微信小程序原生组件swiper实现. <swiper indicator-dots="{{indicatorDots}}&quo ...
- 基于sticky组件,实现带sticky效果的tab导航和滚动导航
上文提供了一个改进版的sticky组件,并将演示效果应用到了自己的博客.有了类似sticky的这种简单组件,我们就可以在利用它开发更丰富的效果,比如本文要介绍的tab导航和滚动导航.实现简单,演示效果 ...
- 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop
[源码下载] 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop 作者:weba ...
- Android ActionBar 关于tab的应用 以及 TabListener的方法详解
actionBar的tab标签应用以及TabListener的方法详解 package com.example.actionBarTest.actionBarTab; import android.a ...
随机推荐
- 搭建App主流框架_纯代码搭建(OC)
转载自:http://my.oschina.net/hejunbinlan/blog/529778?fromerr=EmSuX7PR 搭建主流框架界面 源码地址在文章末尾 达成效果 效果图 注:本文部 ...
- Oracle教程-查询(二)
emp 雇员表字段名称 数据类型 是否为空 备注-------- ----------- -------- --------EMPNO NUMBER(4) ...
- JS和CSS加载(渲染)机制不同
一.结论 CSS可以在页面加载完成后随时渲染.举个例子:通过js给某个元素加一个id或者css,只要这个id或者css有对应的样式,此元素的样式就会自动生效. JS不可以在页面加载完成后生效.最明显的 ...
- opencv----(1) mat最好用,和IplImage,cvmat 比较
学习了几天,发现mat比IplImage,cvmat 好用太多了. 不知道确切的原文出处,我是转自新浪的一篇博文:http://blog.sina.com.cn/s/blog_534497fd0101 ...
- Eclipse开发工具的使用之-使用Eclipse的Debug调试Android程序
1.设置断点,双击Eclipse编辑界面的边界,或者右击编辑界面的边界,快捷键Ctrl+Shift+B. 2.F11键开始调试程序,程序安装到手机之后,并不会自动运行,需要你手动运行到断点处. 3.运 ...
- Cow Hopscotch
Cow Hopscotch 题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have inv ...
- javascript技巧大全套
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcE ...
- Apache2 三种MPM对比分析
就最新版本的Web服务器Apache(版本是Apache 2.4.10,发布于2014年7月21日)来说,一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式. ...
- Javascript Fromdata 与jQuery 实现Ajax文件上传
<!DOCTYPE html> <html> <head> <title>ajax</title> <script type=&quo ...
- java之常用正则表达式
http://www.cnblogs.com/helloczh/articles/1648029.html http://wenku.baidu.com/link?url=gLcsovVfQqRTVa ...