ActionBar的使用常见于4.0系统,其Tab的使用挺广泛的。

在ActionBar中添加标签(Tabs),每个标签对应的是一个Fragment,点击不同的Tab时,就会切换到对应的Fragment。

   大致的步骤如下:

1、如同TabHost控件,每个tab下需要添加内容,这个内容需要结合fragment来显示,因此需创建fragment类,有几个tab就需要几个继承Fragment的类;

2、将fragment添加至ActionBar Tab上,并添加tab监听;

3、监听内部类需要实现ActionBar.Listener接口,当点击Tab的时候触发其事件,需要重写的方法有:

(1)onTabSelected();

(2)onTabReselected();

(3)onTabUnselected();

接下来我们就一起看一个简单的例子吧:

(1)Fragment1.java类

package com.example.l0909_3_actionbartab;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MyFragment1 extends Fragment{
@Override
//Fragment要通过重写onCreateView方法加载视图
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment1, container,false);
}
}

(2)对应的fragment1.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/b24" />
</LinearLayout>

(3)MyFragment2.java类

package com.example.l0909_3_actionbartab;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MyFragment2 extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment2, container,false);
}
}

(4)对应的fragment2.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/b25" />
</LinearLayout>

(3)MainActivity.java文件

package com.example.l0909_3_actionbartab;
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.os.Bundle;
public class MainActivity extends Activity {
//声明ActionBar
private ActionBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建对应的Fragment对象
Fragment fragment1=new MyFragment1();
Fragment fragment2=new MyFragment2();
//创建ActionBar,方法得到Activity中的ActionBar
bar=getActionBar();
//创建TableHost的效果(有三个属性值)
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//创建对应的Tab及对其的设置
Tab tab1=bar.newTab().setText("朋友").setIcon(R.drawable.p1).setTabListener(new TestListener(fragment1));
Tab tab2=bar.newTab().setText("亲人").setIcon(R.drawable.p2).setTabListener(new TestListener(fragment2));
//tab1.setText("朋友");
//tab1.setIcon(R.drawable.ic_launcher);
//tab1.setTabListener(arg0);
//添加Tab到ActionBar中
bar.addTab(tab1);
bar.addTab(tab2);
}
//通过内部类的方式创建Tab的监听类,实现ActionBar.TabListener的接口
class TestListener implements TabListener{
//声明Fragment
private Fragment fragment;
//通过构造引用对应的Fragment
public TestListener(Fragment fragment){
this.fragment=fragment;
}
//实现ActionBar.TabListener接口所要实现的方法
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
ft.add(R.id.mainActivity, fragment, null);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
}
}

注:在onTabUnselected()方法中添加ft.remove(fragment);

(6)运行效果图:

咳咳。。。其实ActionBar还不仅仅是这些用处,我们接下来在接触一些ActionBar的用法,来完善一下上面的例子,使它具有4.0的风格。

1.第一点要补充的是:ActionBar图标的点击事件

bar.setDisplayHomeAsUpEnabled(true);这样就使得ActionBar的图标可点击了,进而可以通过 onOptionsItemSelected()监听方法来处理点击事件的内容,下面的例子中我们实现的是点击ActionBar的图标返回到主界面。

2.第二点要补充的是:

onTouchEvent()这个点击事件,我们可以在这里实现点击屏幕——全屏显示,再点击屏幕——退出全屏的效果。

3.第三点要补充的是:

onCreateOptionsMenu()重写的方法中实现添加ActionBar的子菜单项的功能,并且添加的子选项会根据屏幕的大小决定显示几个,一般显示两个,其他的将隐式与Menu中,手动点击Menu才会出现。

好吧,我们可以看这个完整的例子了:

(1)主入口Activity

package com.example.l0909_3_actionbartab;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class ActOpen extends Activity{
private ActionBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_open);
bar=getActionBar();
findViewById(R.id.btn_open).setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
Intent intent=new Intent(ActOpen.this,MainActivity.class);
startActivity(intent);
finish();
}
}); }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
MenuItem open=menu.add(,,,"打开");
MenuItem add=menu.add(,,,"添加");
//只能添加两项,其余的在Menu中隐藏存在,而若是横屏则会显示更多
MenuItem delete=menu.add(,,,"删除");
MenuItem close=menu.add(,,,"关闭");
//设置ActionBar每个Item的显示方式(如果有地方则显示)
open.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
delete.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
close.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case :
Toast.makeText(this, "open", Toast.LENGTH_SHORT).show();
break;
case :
Toast.makeText(this, "add", Toast.LENGTH_SHORT).show();
break;
case :
Toast.makeText(this, "delete", Toast.LENGTH_SHORT).show();
break;
case :
Toast.makeText(this, "close", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}

(2)内容Activity中:

package com.example.l0909_3_actionbartab;
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.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.MotionEvent;
public class MainActivity extends Activity {
//声明ActionBar
private ActionBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建对应的Fragment对象
Fragment fragment1=new MyFragment1();
Fragment fragment2=new MyFragment2();
//创建ActionBar,方法得到Activity中的ActionBar
bar=getActionBar();
//创建TableHost的效果(有三个属性值)
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//设置ActionBar的图标是可点击的
bar.setDisplayHomeAsUpEnabled(true);
//创建对应的Tab及对其的设置
Tab tab1=bar.newTab().setText("朋友").setIcon(R.drawable.p1).setTabListener(new TestListener(fragment1));
Tab tab2=bar.newTab().setText("亲人").setIcon(R.drawable.p2).setTabListener(new TestListener(fragment2));
//tab1.setText("朋友");
//tab1.setIcon(R.drawable.ic_launcher);
//tab1.setTabListener(arg0);
//添加Tab到ActionBar中
bar.addTab(tab1);
bar.addTab(tab2);
}
/**
* 这个监听是给ActionBar的可点图标用的,即点击ActionBar的可点图标时要做的事
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent intent=new Intent(MainActivity.this,ActOpen.class);
startActivity(intent);
finish();
break;
}
return super.onOptionsItemSelected(item);
}
/**
* 点击屏幕使得显示的内容在全屏与退出全屏之间切换
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
if(bar.isShowing()){
bar.hide();
}else{
bar.show();
}
break;
}
return super.onTouchEvent(event);
}
//通过内部类的方式创建Tab的监听类,实现ActionBar.TabListener的接口
class TestListener implements TabListener{
//声明Fragment
private Fragment fragment;
//通过构造引用对应的Fragment
public TestListener(Fragment fragment){
this.fragment=fragment;
}
//实现ActionBar.TabListener接口所要实现的方法
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
ft.add(R.id.mainActivity, fragment, null);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft.remove(fragment);
}
}
}

(3)两个继承Fragment的类同上;

(4)运行效果如下:

初始界面:

点击ActionBar中的一个Item的效果:

点击Menu菜单显示出其他的ActionBar的Item:

点击“点击进入”时跳入的内容界面:可以看到ActionBar中的图标已经是可点的了,

此时点击它会跳回主界面:

随意点击屏幕的一个位置——全屏显示,再次点击屏幕——退出全屏显示:

Android ActionBar通过Tab进行不同的Fragment之间的交换的更多相关文章

  1. Android ActionBar 关于tab的应用 以及 TabListener的方法详解

    actionBar的tab标签应用以及TabListener的方法详解 package com.example.actionBarTest.actionBarTab; import android.a ...

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

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

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

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

  4. Android Actionbar Tab 导航模式

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

  5. Android actionBar与Fragment结合使用Demo2

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

  6. Android学习笔记Tab代替ActionBar做的顶部导航

    1.先准备5个Fragement作为标签页 package com.lzp.youdaotab; import android.os.Bundle; import android.view.Layou ...

  7. Android SlidingTabLayout的使用--替代ActionBar的Tab导航

    最近在使用ActionBar的时候,如果使用的是最新版V7包或者最新的SDK平台,就会发现 ActionBar的导航功能已经不建议使用了.主要的原因是ActionBar自带Tab导航自定义性差(只能通 ...

  8. Android ActionBar的基本用法

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

  9. Android ActionBar详解

    Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar   目录(?)[+]   第4 ...

随机推荐

  1. 关键字 extern

    定义:extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中.编译器会到其他模块中寻找其定义. extern int f(); extern int i; extern关键字   作为 ...

  2. HR不会告诉你的秘密

    原文转载自http://blog.csdn.net/happy08god/article/details/5534326 下面,只是摘出来一些基本的观点. 1. 入职时的工资高低不重要,只要你努力工作 ...

  3. MFC中获取指针的方法

    1.获取应用程序指针 CMyApp* pApp=(CMyApp*)AfxGetApp(); 2.获取主框架指针 CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针 CMainFr ...

  4. 带搜索的下拉框Chosen

    一:参考 https://harvesthq.github.io/chosen/ Chosen是一个jQuery插件 二:引入js文件 <link href="plug-in/chos ...

  5. 【python】开始python之旅

    上午开始抽空学习python,具体内容如下: (1)安装了python 2.7 (2)安装了notepad ++,安装它之前,在notepad++和Sublime Text之间纠结了一下,baidu了 ...

  6. UVA 11722

    You are going from Dhaka to Chittagong by train and you came to know one of your old friends is goin ...

  7. MenuItem

    private void 文件ToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("打开测试" ...

  8. RegisterClientScriptBlock CommandName 模块列 操作完成 提示

    this.ClientScript.RegisterClientScriptBlock(this.GetType(), "Remind", "alert('获取成功!') ...

  9. [gradle] is applicable for argument types

    error: is applicable for argument types: (org.eclipse.jetty.server.Request) 很显然这个错误是因为 不是静态方法造成的,改为静 ...

  10. 【Entity Framework】初级篇--ObjectContext、ObjectQuery、ObjectStateEntry、ObjectStateManager类的介绍

    本节,简单的介绍EF中的ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager这个几个比较重要的类,它们都位于System.Data ...