Android ActionBar通过Tab进行不同的Fragment之间的交换
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之间的交换的更多相关文章
- Android ActionBar 关于tab的应用 以及 TabListener的方法详解
actionBar的tab标签应用以及TabListener的方法详解 package com.example.actionBarTest.actionBarTab; import android.a ...
- Android入门之ActionBar实现Tab导航
效果图: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=&qu ...
- Android 原生 Android ActionBar Tab (滑动)导航
本文内容 环境 项目结构 演示一:ActionBar Tab 导航 演示二:ActionBar Tab 带滑动导航 本文演示 Tab 导航.第一个演示,是基本的 Tab 导航,第二个是带滑动的 Tab ...
- Android Actionbar Tab 导航模式
Android Actionbar Tab 下图中,红色矩形圈起来的就是我们 ActionBar Tab,下面我们将一步一步的实现下图中的效果. 初次尝试 package com.example.it ...
- Android actionBar与Fragment结合使用Demo2
上一篇文章介绍了ActionBar的使用,这里介绍ActionBar的还有一种用法.达到的效果和曾经的GroupActivity或TabHost是一样的,可作为导航来使用. 实现效果图: 源码: 布局 ...
- Android学习笔记Tab代替ActionBar做的顶部导航
1.先准备5个Fragement作为标签页 package com.lzp.youdaotab; import android.os.Bundle; import android.view.Layou ...
- Android SlidingTabLayout的使用--替代ActionBar的Tab导航
最近在使用ActionBar的时候,如果使用的是最新版V7包或者最新的SDK平台,就会发现 ActionBar的导航功能已经不建议使用了.主要的原因是ActionBar自带Tab导航自定义性差(只能通 ...
- Android ActionBar的基本用法
一 说明android 3.0后出现, 在3.0之前称为Title Bar 显示位置在标题栏上可以显示应用程序的图标和activity的标题创建方式的和系统菜单相似, 区别在于: android: ...
- Android ActionBar详解
Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar 目录(?)[+] 第4 ...
随机推荐
- [GeekBand] C++11~14
一.关键字decltype 由对象得到对象的数据类型,例如 Complex a(1, 2); decltype(a) b(3, 4); declare type是让编译器去找到 ...
- echo & print
在实际使用中, print 和 echo 两者的功能几乎是完全一样.可以这么说,凡是有一个可以使用的地方,另一个也可以使用.但是,两者之间也还是一个非常重要的区别:在 echo 函数中,可以同时输出多 ...
- 正文字体大小:大 中 小 解决configure: error: Cannot find libmysqlclient under /usr
今天在64位centos5.6系统上编译PHP5.2.17报错 checking for MySQL support... yes, shared checking for specified loc ...
- 【ZeroMQ】消息模式
1.请求/应答模式(REP/REQ) 该模式特征: 服务器使用REP类型套接字而客户端使用REQ类型套接字 客户端发送请求和接收答复,而服务器则接收请求并发送答复 客户端可以连接到一个或多个服务器.在 ...
- delphi 仅带下划线的TEdit控件
在做录入框的时候,很希望有一个只带下划线的文本框,网上介绍的很多,有自己做组件的,须不知Delphi下只需要简单设置几个属性即可达到目的.
- Pox组件
最近在学习Pox,为了加深印象,对Pox wiki中的Pox组件写了些笔记. 按照组件的功能进行分类: L2层地址学习.洪泛 forwarding.hub forwarding.l2_lear ...
- 【转】perl中尖括号运算符(<>)使用说明
perl中尖括号运算符的用途分享,这里简单介绍下,方便需要的朋友 perl中<>运算符可以有如下的用途: 1)如果尖括号中间是文件句柄,尖括号运算符允许你读取文件句柄,比如<STDI ...
- 【信息学奥赛一本通】第三部分_队列 ex2_3produce 产生数
给出一个整数n(n<=2000)(代码可适用n<=10^31)和k个变换规则(k<=15). 规则:1.1个数字可以变换成另1个数字: 2.规则中右边的数字不能为零. BFS #in ...
- (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...
- Unity3d 协程、调用函数、委托
(一)协程 开启方法:StartCoroutine("函数名"): 结束方法StopCoroutine("函数名"),StopAllCoroutines(); ...