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"?>

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/p_w_picpathView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/b24" />

(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文件

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/p_w_picpathView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/b25" />

(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)运行效果图:

573564ac440da17bbfeeda75b557b9d8.png

b9012572d621506681563efba6085903.png

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

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

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

2.第二点要补充的是:

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

3.第三点要补充的是:

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

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

(1)主入口Activitypackage 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(0,1,0,"打开");

MenuItem add=menu.add(0,2,0,"添加");

//只能添加两项,其余的在Menu中隐藏存在,而若是横屏则会显示更多

MenuItem delete=menu.add(0,3,0,"删除");

MenuItem close=menu.add(0,4,0,"关闭");

//设置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 1:

Toast.makeText(this, "open", Toast.LENGTH_SHORT).show();

break;

case 2:

Toast.makeText(this, "add", Toast.LENGTH_SHORT).show();

break;

case 3:

Toast.makeText(this, "delete", Toast.LENGTH_SHORT).show();

break;

case 4:

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)运行效果如下:

初始界面:

5e1f3f01f600d2040e21349f1a5fe0b8.png

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

b227f11026bca81d6bada0ad83df08d6.png

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

7642ce0a762822ee2cf801e1fdc47799.png

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

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

d85c1e18e45a286219f8bbe182d7d365.png

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

b858df78719bdc0eba53a08e054b290a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值