Android活动条(actionbar)使用详解(二)

  1.使用ActionBar实现Tab导航

使用ActionBar实现Tab导航的思路是:AcitonBar通常与Fragment结合使用实现Tab导航。ActionBar在顶端生成多个Tab标签,当用户点击某个Tab标签时,系统根据用户点击事件导航指定Tab页面。实现步骤如下:

(1)调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法设置使用Tab导航方式;

(2)调用ActionBar的addTab()方法添加多个Tab标签,并为每个Tab标签添加事件监听器.

源码实战:

(1)src/mFragment.java

功能:实现一个Fragment子类。可以通过getArguments()方法来获取创建该Fragment时传入的参数Bundle,然后,使用Bundle对象的getXXX(键)获得Activity传入该Fragment的数据,并显示到Fragment的自定义布局的相应组件即可。

package com.example.actionbar;
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;
/**
 *	项目名称/版本号:Actionbar/v1.0
 *	包   名:com.example.actionbar
 *	类描述:实现一个简单的Fragment,即只显示一个TextView组件
 *	创建人:jiangdongguo
 *	创建时间:2015-6-12 下午9:42:35
 * 博客地址:http://blog.csdn.net/u012637501
 */
public class mFragment extends Fragment {
public static final String ARG_TEXT_DATA="text_data";	 //Bundle所需的键值
/**
 * 该方法的返回值就是该Fragment显示的View组件
 * */
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setGravity(Gravity.START);
textView.setScrollContainer(true);
//a.获取创建该Fragment时传入的参数Bundle
Bundle bundle = getArguments();
//b.将传入的数据显示到
textView.setText(bundle.getString(ARG_TEXT_DATA));
//c.返回该view
return textView;
}
}

(2)src/MainActivity.java

功能:由于本应用只是用于使用ActionBar与Fragment实现Tab导航,所以该Activity的关键代码主要在于a)设置ActionBar的导航方式---Tab导航,然后依次添加多个Tab页并为每个Tab标签添加事件监听器;b)实现Tab标签事件监听器onTabSelected()方法,并在该方法中根据用户选中的Tab标签替换新的Fragment,替换方法如下:

>创建一个继承于Fragment的自定义子类对象;

>创建一个Bundle对象,并将需要传入到Fragment子类的数据打包到Bundle对象中;

>调用Fragment对象的setArguments(bundle)方法向fragment传送数据;

>获取FragmentTransaction对象,并调用其replace(int containerViewId, Fragment fragment) 方法使fragment代替该Activity的容器(这里使用的是LinearLayout)组件,最后,提交事物。

fragment.setArguments(bundle);

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();

fragmentTransaction.replace(R.id.mContainer, fragment);

fragmentTransaction.commit();

package com.example.actionbar;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.textmining.text.extraction.WordExtractor;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.os.Environment;

/**
 *	项目名称/版本号:Actionbar/v1.0
 *	包   名:com.example.actionbar
 *	类描述:
 *	创建人:jiangdongguo
 *	创建时间:2015-6-12 下午9:29:17
 * 博客地址:http://blog.csdn.net/u012637501
 */
public class MainActivity extends Activity implements ActionBar.TabListener {
private static final String SELECTION_ITEM = "select_item";
//	private AssetManager assetManager = null;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      //a.如果程序正确启用了活动条,将会返回一个ActionBar对象,否则返回null
        ActionBar actionBar = getActionBar();
       //b.设置ActionBar的导航方式,即Tab导航
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        //c.依次添加三个Tab页,并为三个Tab标签添加事件监听器
        actionBar.addTab(actionBar.newTab().setText("林俊杰").setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText("中国").setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText("赵文卓").setTabListener( this));
    }

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
if(savedInstanceState.containsKey(SELECTION_ITEM)){
//选中前面保存的索引对应的Fragment页
getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(SELECTION_ITEM));
}
}

@Override
protected void onSaveInstanceState(Bundle outState) {
//将当前选中的Fragment也的索引保存到Bundle中
outState.putInt(SELECTION_ITEM, getActionBar().getSelectedNavigationIndex());
}
/**
 *	方法名(重载):onTabSelected
 *	功能描述:当指定Tab被选中时激发该方法.在该方法中根据用户选中的Tab标签替换新的Fragment
 *  Date       :2015-6-12[J]
 */
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
AssetManager assetManager = getResources().getAssets();	 //获取assets资源对象
InputStream inputStream = null;
WordExtractor extractor = null;
//a.创建一个新的Fragment对象
Fragment fragment = new mFragment();
//b.创建一个Bundle对象,用于向Fragment传入参数(数据)
Bundle bundle = new Bundle();
try {
if(tab.getPosition()==0){
inputStream = assetManager.open("linjunjie.txt");	//获得资产文件对应的输入流
}else if(tab.getPosition()==1){
inputStream = assetManager.open("china.txt");	//获得资产文件对应的输入流
}
int length = inputStream.available();//得到输入流所包含的字节总数
byte[] buffer = new byte[length];	 //创建一个缓存字节数组
inputStream.read(buffer);	  //将输入流数据读入到字节数组中
bundle.putString(mFragment.ARG_TEXT_DATA, new String(buffer, "GB2312"));	//将字节数组数据转换为字符串,保存到Bundle对象中
inputStream.close();

} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
//c.向fragment传入数据
fragment.setArguments(bundle);
//d.获取FragmentTransaction对象
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
//c.使用fragment代替该Activity中的containner组件
fragmentTransaction.replace(R.id.mContainer, fragment);
//d.提交事物
fragmentTransaction.commit();
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}

(3)res/layout/main,xml

功能:Activity的界面布局只定义一个简单的容器(如LinearLayout),方便Activity使用该容器盛装Fragment.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"/>

(4)效果演示

(5)Fragment技术

Fragment相当于Activity的片段,可以使用单独的Activity组合多个Fragment(即一个Activity包含多个界面),也可让多个Activity复用一个Fragment。Fragment相当于Activity的模块化区域,主要特性如下:

a)Fragment有自己的生命周期,其可以接收、处理属于它自身的事件,并允许Activity运行期间动态地添加或删除Fragment。

b)Fragment允许定义自己的布局,也可以通过生命周期回调方法定义自己的行为,类似于Activity;

c)开发者自定义的Fragment需要继承Fragment,并重写它的生命周期方法,通常会重写Fragment的onCreateView()返回Freagment视图。

 2.使用ActionBar实现下拉式导航

ActionBar除了提供Tab导航支持之外,还提供了下拉式(DropDown)导航方式。下拉式导航的ActionBar特点是:在界面顶端生成一个下拉列表框,当用户单击某个列表项时,系统根据用户单击事件导航指定的Fragment。实现步骤如下:

◆调用ActionBar的actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST)方法设置使用下拉列表的导航方式;

◆调用ActionBar的setListNavigationCallBacks(SpinnerAdapter adapter,ActionBar.OnNavigationListener callback)()添加多个列表项,并为每个列表项设置事件监听器。其中第一个参数Adapter负责提供多个列表项,第二个参数为事件监听器。

package com.example.actionbar;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.textmining.text.extraction.WordExtractor;

import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.os.Environment;
import android.widget.ArrayAdapter;

/**
 *	项目名称/版本号:Actionbar/v1.0
 *	包   名:com.example.actionbar
 *	类描述:
 *	创建人:jiangdongguo
 *	创建时间:2015-6-12 下午9:29:17
 * 博客地址:http://blog.csdn.net/u012637501
 */
public class MainActivity extends Activity implements ActionBar.TabListener, OnNavigationListener {
 private static final String SELECTION_ITEM = "select_item";
//	private AssetManager assetManager = null;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      //a.如果程序正确启用了活动条,将会返回一个ActionBar对象,否则返回null
        ActionBar actionBar = getActionBar();
        //设置ActionBar是否显示标题
        actionBar.setDisplayShowTitleEnabled(true);
        //设置导航模式,使用List导航
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        //为actionBar添加ArrayAdapter
  actionBar.setListNavigationCallbacks(new ArrayAdapter<String>(
    MainActivity.this, android.R.layout.simple_list_item_1,
    android.R.id.text1, new String[] { "林俊杰", "中国", "赵文卓" }), this);
    }

 @Override
 protected void onRestoreInstanceState(Bundle savedInstanceState) {
  if(savedInstanceState.containsKey(SELECTION_ITEM)){
   //选中前面保存的索引对应的Fragment页
   getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(SELECTION_ITEM));
  }
 }
 @Override
 protected void onSaveInstanceState(Bundle outState) {
  //将当前选中的Fragment也的索引保存到Bundle中
  outState.putInt(SELECTION_ITEM, getActionBar().getSelectedNavigationIndex());
 }
 /**
  *	方法名(重载):onNavigationItemSelected
  *	功能描述:当指定Item被选中时激发该方法.在该方法中根据用户选中的Tab标签替换新的Fragment
  *  Date       :2015-6-13[J]
  */
 @Override
 public boolean onNavigationItemSelected(int itemPosition, long itemId) {
  AssetManager assetManager = getResources().getAssets();	 //获取assets资源对象
  InputStream inputStream = null;
  WordExtractor extractor = null;
  //a.创建一个新的Fragment对象
  Fragment fragment = new mFragment();
  //b.创建一个Bundle对象,用于向Fragment传入参数(数据)
  Bundle bundle = new Bundle();
  try {
    if(itemPosition==0){
      inputStream = assetManager.open("linjunjie.txt");	//获得资产文件对应的输入流
    }else if(itemPosition==1){
      inputStream = assetManager.open("china.txt");	//获得资产文件对应的输入流
    }
    int length = inputStream.available();//得到输入流所包含的字节总数
    byte[] buffer = new byte[length];	 //创建一个缓存字节数组
    inputStream.read(buffer);	 //将输入流数据读入到字节数组中
    bundle.putString(mFragment.ARG_TEXT_DATA, new String(buffer, "GB2312"));	//将字节数组数据转换为字符串,保存到Bundle对象中
    inputStream.close();

  } catch (IOException e) {
   e.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  }
  //c.向fragment传入数据
  fragment.setArguments(bundle);
  //d.获取FragmentTransaction对象
  FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
  //c.使用fragment代替该Activity中的containner组件
  fragmentTransaction.replace(R.id.mContainer, fragment);
  //d.提交事物
  fragmentTransaction.commit();
  return true;
 }
}

效果演示:

注意:这里我们只需要设置ActionBar为下拉列表导航模式,在在列表向的事件监听器onNavigationItemSelected(int itemPosition, long itemId)根据itemPostion(指定的列表项ID)替换为相应的Fragment即可。

时间: 2024-10-13 09:16:08

Android活动条(actionbar)使用详解(二)的相关文章

Android活动条(actionbar)使用详解(一)

活动条(ActionBar)是Android3.0的重要更新之一,ActionBar位于传统标题的位置,其主要提供了如下功能: >显示选项菜单的菜单项,即激昂菜单项显示在Action Item; >使用程序图标作为返回Home主屏或向上的导航操作; >提供交互式View作为Action View; >提供基于Tab的导航方式,可用于切换多个Fragment >提供基于下拉的导航方式 1.启用/关闭ActionBar Android3.0及以上版本已经默认启用了ActionBa

【Android UI设计与开发】8.顶部标题栏(一)ActionBar 奥义&#183;详解

原文地址:http://www.cnblogs.com/yc-755909659/p/4290784.html 一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和menu,在程序运行中一直置于顶部,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更多丰富的内容,方便操控. 二.ActionBar的功能 用图的方式来讲解

【Android UI设计与开发】顶部标题栏(一)ActionBar 奥义&#183;详解

转自:http://www.cnblogs.com/yc-755909659/p/4290784.html 一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和menu,在程序运行中一直置于顶部,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更多丰富的内容,方便操控. 二.ActionBar的功能 用图的方式来讲解它的

Android自定义控件系列八:详解onMeasure()(二)--利用onMeasure测量来实现图片拉伸永不变形,解决屏幕适配问题

上一篇文章详细讲解了一下onMeasure/measure方法在Android自定义控件时的原理和作用,参看博文:Android自定义控件系列七:详解onMeasure()方法中如何测量一个控件尺寸(一),今天就来真正实践一下,让这两个方法大显神威来帮我们搞定图片的屏幕适配问题. 请尊重原创劳动成果,转载请注明出处:http://blog.csdn.net/cyp331203/article/details/45038329,非允许请勿用于商业或盈利用途,违者必究. 使用ImageView会遇到

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

[Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.Android 布局学习之——LinearLayout的layout_weight属性   4.Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline    Layout Parameters(布局参数): 在XML文件中,我们经常看到类似与lay

Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送,写这个系列真的很要命,你要去把他们的API文档大致的翻阅一遍,而且各种功能都实现一遍,解决各种bug各种坑,不得不说,极光推送真坑,大家使用还是要慎重,我们看一下极光推送的官网 https://www.jpush.cn/common/ 推送比较使用,很多软件有需要,所以在这个点拿出来多讲讲,我们本节

Android组件系列----Activity组件详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3924567.html 联系方式:[email protected] [正文] 注:四大组件指的是应用组件:Activity.Service.BroadcastReceiver.ContentProvider:之前的控件指的是UI组件. 博文目录: 一.Activity简介 二.Activity的状

Android开发之通知栏Notification详解

Notification的用法  --- 状态栏通知 发送一个状态栏通知必须的两个类: 1. NotificationManager   --- 状态栏通知的管理类,负责发通知,清除通知等 NotificationManager : 是一个系统Service,必须通过 context.getSystemService(NOTIFICATION_SERVICE)方法获取 NotificationManager notificationManager = (NotificationManager)