本节书摘来自异步社区《Android 平板电脑开发实战详解和典型案例》一书中的第2章,第2.4节动作条——ActionBar,作者 吴亚峰 , 杜化美 , 索依娜,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.4 动作条——ActionBar
Android 平板电脑开发实战详解和典型案例
Android 3.0正式引入了ActionBar控件,抛弃了传统的导航功能,使用软件按钮取代了物理主屏、菜单、后退等按钮,规范了应用程序的导航设计。向开发人员提供了一个相对较新的导航控件,提供了更丰富的功能。
本节将介绍动作条ActionBar的基础知识与简单应用。主要内容是显示选项菜单和提供标签页的切换方式的导航以及提供下拉列表条目导航的操作。
2.4.1 显示选项菜单基本知识
ActionBar上有空间时才会显示选项菜单,否则会置于系统默认的菜单里面。一个选项菜单可以包含图标、文本或者两个兼有,这些都可以在菜单配置文件中进行设置。菜单资源在菜单配置文件中的相关属性如表2-2所示。
对于菜单资源中的其他属性,由于篇幅所限,笔者将不再一一赘述,请读者自行查阅相关的API。
2.4.2 显示选项菜单使用案例
通过前面的介绍,读者对显示选项菜单已经有了简单的了解,下面通过案例sample2_4使读者进一步掌握显示菜单的使用。在介绍开发案例之前,首先请读者了解一下本案例的运行效果,如图2-13、图2-14和图2-15所示。
图2-13是运行案例后的效果图,图2-14和图2-15是单击图2-13中ActionBar里的选项菜单后出现的效果图。
了解了案例的运行结果之后,下面开始介绍案例的开发,具体步骤如下。
(1)首先需要编写的是选项菜单配置文件menu.xml的开发,其代码如下。
1 <?xml version="1.0" encoding="utf-8"?> <!--版本号和编码方式 -->
2 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
3 <item <!--设置菜单项-->
4 android:id="@+id/sweep" <!--设置ID-->
5 android:icon="@drawable/aaa" <!--添加图片-->
6 android:title="Android核心技术与实例详解" <!--添加文本标题-->
7 android:onClick="onOptionSweep" <!--添加单击菜单方法-->
8 android:showAsAction="ifRoom" /> <!--设置菜单放置形式-->
9 <item <!--设置菜单项-->
10 android:id="@+id/scrub" <!--设置ID-->
11 android:icon="@drawable/bbb" <!--添加图片-->
12 android:title="Android 2.0游戏开发实战宝典" <!--添加文本标题-->
13 android:onClick="onOptionScrub" <!--添加单击菜单方法-->
14 android:showAsAction="ifRoom"/> <!--设置菜单放置形式-->
15 <item <!--设置菜单项-->
16 android:id="@+id/vacuum" <!--设置ID-->
17 android:icon="@drawable/ccc" <!--添加图片-->
18 android:title="Android应用案例开发大全" <!--添加文本标题-->
19 android:onClick="onOptionVacuum" <!--添加单击菜单方法-->
20 android:showAsAction="ifRoom" /> <!--设置菜单放置形式-->
21 <item <!--设置菜单项-->
22 android:id="@+id/kaifa" <!--设置ID-->
23 android:icon="@drawable/ddd" <!--添加图片-->
24 android:title="Android 3D游戏开发技术详解与典型案例" <!--添加文本标题-->
25 android:onClick="ononOptionSelect" <!--添加单击菜单方法-->
26 android:showAsAction="ifRoom" /> <!--设置菜单放置形式-->
27 </menu>
该菜单文件的布局比较简单,在一个菜单布局中添加了几个菜单项。值得注意的是,每个菜单项中的属性android:onClick是指单击本菜单项后调用以此属性值为名的方法。
(2)完成了菜单配置文件menu.xml的开发后,下面将要开发的是单击显示菜单项后跳转到Actvity的配置文件scrub.xml的开发,其代码如下。
1 <?xml version="1.0" encoding="utf-8"?>
2 <ScrollView
3 xmlns:android=http://schemas.android.com/apk/res/android
4 android:id="@+id/scrollView2" <!—添加id-->
5 android:layout_width="fill_parent" <!--充满父控件 -->
6 android:layout_height="wrap_content" > <!—高度自身决定-->
7 <LinearLayout
8 android:id="@+id/linearLayout2" <!--设置id-->
9 android:layout_width="fill_parent" <!--充满父控件-->
10 android:layout_height="wrap_content" <!--高度自身决定-->
11 android:orientation="vertical" > <!---垂直排序-->
12 <TextView <!--文本视图控件-->
13 android:id="@+id/textView4" <!--设置ID-->
14 android:layout_width="wrap_content" <!--宽度自身决定-->
15 android:layout_height="wrap_content" <!--高度自身决定-->
16 android:text="Android 2.0游戏开发实战宝典" <!--设置内容-->
17 android:textSize="30dip" <!--设置字体大小-->
18 android:textcolor=”@color/white”/> <!--设置颜色-->
19 <ImageView <!--图像视图控件-->
20 android:id="@+id/imageView2" <!--设置ID-->
21 android:layout_width="400dip" <!--设置宽度-->
22 android:layout_height="400dip " <!--设置高度-->
23 android:src="@drawable/bbb" /> <!--添加图片-->
24 <TextView <!--文本视图控件-->
25 android:id="@+id/textView5" <!--设置ID-->
26 android:layout_width="wrap_content" <!--宽度自身决定-->
27 android:layout_height="wrap_content" <!--高度自身决定-->
28 android:text="内容简介" <!--设置内容-->
29 android:textSize="30dip" <!--设置字体大小-->
30 android:textcolor=”@color/white”/> <!--设置颜色-->
31 <TextView <!--文本视图控件-->
32 android:id="@+id/textView6" <!--设置ID-->
33 android:textSize="20dip" <!--设置字体大小-->
34 android:layout_width="wrap_content" <!--宽度自身决定-->
35 android:layout_height="wrap_content"/> <!--高度自身决定-->
36 android:textcolor=”@color/white”/> <!--设置颜色-->
37 </LinearLayout>
38 </ScrollView>
该界面的布局比较简单,在一个充满整个屏幕的ScrollView控件中放置了一个LinearLayout控件,在LinearLayout控件里面放置了TextView和ImageView。
(3)完成了单击菜单项后跳转到Actvity的配置文件scrub.xml开发后,下面将要开发的是单击菜单项后跳转到Activity对应的类ScrubActivity的开发,其代码如下。
1 package com.bn.sample2_4; //声明包
2 ……//该处省略了部分类的导入代码,读者可自行查看随书光盘中的源代码
3 public class ScrubActivity extends Activity{ //继承Activity
4 @Override
5 protected void onCreate(Bundle savedInstanceState){ //重写方法
6 super.onCreate(savedInstanceState); //调用父类方法
7 setContentView(R.layout.scrub); //设置布局界面
8 String str="/sdcard/bbb.txt"; //设置读取文本路径
9 String result=getString(str); //获取文本
10 TextView tv=(TextView)findViewById(R.id.textView6); //获得TextView
11 tv.setText(result);} //设置内容
12 private String getString(String str){ //获取文本方法
13 String result=null;
14 try{
15 InputStream it=getAssets().open("youxi.txt"); //读取文件
16 byte[]bb=new byte[it.available()]; //设置大小
17 it.read(bb); //读取内容放到bb数组里面
18 it.close(); //关闭IO流
19 result=new String(bb,"GBK"); //获取的内容转换成中文
20 }catch(Exception e){
21 Toast.makeText(this,"找不到指定的文件",
22 Toast.LENGTH_SHORT).show();} //无法读取文件时响应
23 return result;}} //返回文本
第6~11行为初始化界面。其中第6~9行为设置布局界面和获取添加的文本,第10~11行为获取TextView对象后添加内容。
第12~23 行为获取文本的方法。第15~19行为获取文件然后新建一个byte数组,把内容读到byte数组里面,然后转换成字符串返回。
由于篇幅有限,只介绍其中一种单击菜单项后所跳转到的Activity的开发。
(4)完成了单击菜单项后所跳转到Activity对应的类ScrubActivity的开发后,下面将要开发的是主Activity对应的类ActionBarEx的开发,其代码如下。
1 package com.bn.sample2_4; //声明包
2 ……//该处省略了部分类的导入代码,读者可自行查看随书光盘中的源代码
3 public class ActionBarEx extends Activity { //继承Activity
4 @Override
5 public void onCreate(Bundle savedInstanceState){ //重写方法
6 super.onCreate(savedInstanceState); //调用父类方法
7 setContentView(R.layout.main);} //设置界面布局文件
8 @Override //重写方法
9 public boolean onCreateOptionsMenu(Menu menu){
10 MenuInflater inflater=getMenuInflater(); //加载菜单配置文件
11 inflater.inflate(R.menu.menu, menu);
12 return true;}
13 public void onOptionSweep(MenuItem i){ //菜单项对应的方法
14 this.startActivity(new Intent(this,SweepActivity.class));} //跳转到SweepActivity
15 public void onOptionScrub(MenuItem i){ //菜单项对应的方法
16 this.startActivity(new Intent(this,ScrubActivity.class));} //跳转到ScrubActivity
17 public void onOptionVacuum(MenuItem i){ //菜单项对应的方法
18 this.startActivity(new Intent(this,VacuumActivity.class));}//跳转到VacuumActivity
19 public void ononOptionSelect(MenuItem i){ //菜单项对应的方法
20 this.startActivity(new Intent(this,SelectedActivity.class));}} //跳转到Selected
//Activity
第5~12行为重写父类方法,第6~7行为调用父类方法和设置布局界面,第10~11行为加载菜单配置文件,把菜单添加到ActionBar。
第13~18行为在菜单配置文件当中android:onClick对应的方法,每个方法都发送一个Intent跳转到对应的界面。
2.4.3 提供标签页切换方式的导航功能基本知识
ActionBar可以显示标签页,使用户可以在不同fragment之间进行切换来显示各自的内容,fragment的继承树如图2-16所示。每个标签页可以包含图标或者文本。标签页进行交互事件时必须实现ActionBar.TabListener接口。
2.4.4 提供标签页切换方式导航功能使用案例
通过前面的介绍,读者对提供标签页的导航已经有了一个基本的了解,下面通过一个简单的案例Sample2_5使读者进一步掌握导航功能的使用,在正式介绍此案例的开发步骤之前,首先请读者了解一下此案例的运行效果,如图2-17、图2-18和图2-19所示。
图2-17为运行该案例后的效果图,单击标签会显示图2-18、图2-19的效果。
了解了案例的运行效果之后,下面开始介绍案例的开发,具体步骤如下。
(1)首先需要编写的是主配置文件main.xml的开发,其代码如下。
1 <?xml version="1.0" encoding="utf-8"?> <!--版本号和编码方式 --->
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent" <!--充满父控件--->
4 android:layout_height="fill_parent" <!--充满父控件--->
5 android:orientation="vertical" > <!--垂直放置--->
6 <LinearLayout
7 android:id="@+id/linearLayout1" <!--设置ID-->
8 android:layout_width="match_parent" <!-d-匹配父控件-->
9 android:layout_height="wrap_content" <!--高度自身决定-->
10 android:orientation="horizontal" <!--水平放置-->
11 android:gravity="center_horizontal"> <!--设置摆放位置-->
12 </LinearLayout>
13 </LinearLayout>
该布局界面比较简单,一个充满屏幕的竖直排列的LinearLayout中放置了一个用来放置显示诗词的水平排列的LinearLayout。
(2)完成了配置文件main.xml的开发后,下面将要开发的是主Activity对应的类ActionBarEx2
Activity的开发,其代码如下。
1 package com.bn.sample2_5;
2 ……//该处省略了部分类的导入代码,读者可自行查看随书光盘中的源代码
3 public class ActionBarEx2Activity extends Activity{ //继承Activity
4 @Override //重写方法
5 public void onCreate(Bundle savedInstanceState){
6 super.onCreate(savedInstanceState); //调用父类方法
7 setContentView(R.layout.main); //设置布局界面
8 ActionBar ac=getActionBar(); //获取动作条对象
9 ac.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS) ; //启动标签模式
10 ac.setDisplayShowTitleEnabled(false); //不显示标题
11 @SuppressWarnings("unused")
12 Fragment artistsFragment = new ArFragment (); //创建一个片段对象
13 ac.addTab(ac.newTab().setText(R.string.a).
14 setTabListener(new MyTabListener(artistsFragment)));
15 @SuppressWarnings("unused")
16 Fragment artillFragment=new ArtistsFragment(); //创建一个片段对象
17 ac.addTab(ac.newTab().setText(R.string.b). setTabListener(new
18 MyTabListener(artillFragment))); //设置标题及单击Tab时调用的方法
19 Fragment artrrFragment=new AtFragment(); //创建一个Fragment对象
20 ac.addTab(ac.newTab().setText(R.string.c). setTabListener(new
21 MyTabListener(artrrFragment)));}} //设置标题及单击Tab时调用的方法
22 class ArtistsFragment extends Fragment{ //继承Fragment
23 @Override //重写父类方法创建内容
24 public View onCreateView(LayoutInflater inflater,
25 ViewGroup container, Bundle savedInstanceState){
26 TextView tv=new TextView(getActivity()); //创建TextView
27 ScrollView scroller = new ScrollView(getActivity()); //创建一个ScrollView
28 scroller.addView(tv); //TextView添加到ScrollView
29 int padding=5;
30 tv.setPadding(padding,padding,padding,padding); //设置四周间隔
31 tv.setTextSize(35); //设置字体大小
32 tv.setText(" 望岳\n"+"岱宗夫如何,"+"\n齐鲁青未了。\n造化钟神秀,\n阴阳割昏晓。"+
33 "\n荡胸生层云,\n决眦入归鸟。\n会当凌绝顶,"+"\n一览众山小。"); //设置TextView内容
34 return scroller;}} //返回ScrollView
35 class AtFragment extends Fragment{ //继承Fragment
36 @Override
37 public View onCreateView(LayoutInflater inflater,
38 ViewGroup container, Bundle savedInstanceState){
39 TextView tv=new TextView(getActivity()); //创建一个TextView
40 ScrollView scroller = new ScrollView(getActivity());//创建一个ScrollView
41 scroller.addView(tv); //TextView添加到ScrollView
42 int padding=5;
43 tv.setPadding(padding,padding,padding,padding); //设置四周间隔
44 tv.setTextSize(35); //设置字体大小
45 tv.setText(" 岳阳楼\n"+"岳阳城下水漫漫,"+
46 "\n独上危楼凭曲阑。\n春岸绿时泽,"+"\n夕波红处近长安。\n猿攀树立啼何苦,"+
47 "\n雁点湖飞渡亦难。\n此地唯堪画图障,"+"\n华堂张与贵人看。\n"); //设置TextView内容
48 return scroller;}} //返回ScrollView
49 class ArFragment extends Fragment{ //继承Fragment
50 @Override
51 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState){
52 TextView tv=new TextView(getActivity()); //创建一个TextView
53 ScrollView scroller = new ScrollView(getActivity()); //创建一个ScrollView
54 scroller.addView(tv); //TextView添加到ScrollView
55 int padding=5;
56 tv.setPadding(padding,padding,padding,padding); //设置四周间隔
57 tv.setTextSize(35); //设置字体大小
58 tv.setText(" 望庐山瀑布\n"+"日照香炉生紫烟,\n遥看瀑布挂前川。"+
59 "\n飞流直下三千尺,\n疑是银河落九天。\n"); //设置TextView内容
60 return scroller;}} //返回ScrollView
61 class MyTabListener implements ActionBar.TabListener{ //实现ActionBar.TabListener
62 private Fragment mFragment; //创建Fragment变量
63 public MyTabListener(Fragment artistsFragment){ //创建一个构造器
64 this.mFragment=artistsFragment;}
65 public void onTabReselected(Tab tab, FragmentTransaction ft){} //重写方法
66 public void onTabSelected(Tab tab,
67 FragmentTransaction ft){ //单击Tab时Fragment添加到linearLayout1
ft.add(R.id.linearLayout1,mFragment,null);}
69 public void onTabUnselected(Tab tab, FragmentTransaction ft){
ft.remove(mFragment);}} //没有选中的Tab从linearLayout1中删除
第3~21行为初始化界面。![图片8~10行为获得ActionBar对象及启动Tab模式和设置标题。![图片11~21行为创建Fragment对象及设置Tab标题和调用单击Tab时的方法。
第22~60行为创建3个继承Fragment的类,每个类都创建一个ScrollView和TextView。用TextViw来添加文本并添加到ScrollView,并返回ScrollView。
第61~70行为实现ActionBar.TabListener接口的类,第62~64行为增加了一个构造方法,用于保存Tab相关的Fragment进行添加或删除。第65~70行为添加或删除Fragment的方法。
2.4.5 提供下拉列表导航功能基本知识
为了给Activity提供内容并进行界面切换,ActionBar还提供了下拉列表导航功能。接口SpinnerAdapter是为下拉列表提供内容和列表界面的布局,其继承关系如图2-20所示。接口ActionBar.OnNavigationListener是为当列表被选择时进行的操作。
2.4.6 提供下拉列表导航功能使用案例
通过前面的基本知识,读者对提供下拉列表导航功能已经有了基本的了解。下面通过案例Sample2_6使读者进一步掌握下拉列表功能的使用,在正式介绍此案例的开发步骤之前首先请读者了解一下本案例的运行效果,如图2-21、图2-22和图2-23所示。
单击图2-21下拉列表里的选项时会显示图2-22和图2-23的效果。
了解了案例的运行效果之后,下面开始介绍案例的开发,具体步骤如下。。
(1)首先需要编写的是选择下拉列表的选项时跳转到Activity的配置文件scrub.xml的开发。其代码如下。
1 <?xml version="1.0" encoding="utf-8"?>
2 <ScrollView
3 xmlns:android=http://schemas.android.com/apk/res/android
4 android:id="@+id/scrollView2" <!—添加id-->
5 android:layout_width="fill_parent" <!--充满父控件 -->
6 android:layout_height="wrap_content" > <!—高度自身决定-->
7 <LinearLayout
8 android:id="@+id/linearLayout2" <!--设置id-->
9 android:layout_width="fill_parent" <!--充满父控件-->
10 android:layout_height="wrap_content" <!--高度自身决定-->
11 android:orientation="vertical" > <!---垂直排序-->
12 <TextView <!--文本视图控件-->
13 android:id="@+id/textView4" <!--设置ID-->
14 android:layout_width="wrap_content" <!--宽度自身决定-->
15 android:layout_height="wrap_content" <!--高度自身决定-->
16 android:text="Android 2.0游戏开发实战宝典" <!--设置内容-->
17 android:textSize="30dip" <!--设置字体大小-->
18 android:textcolor=”@color/white”/> <!--设置颜色-->
19 <ImageView <!--图像视图控件-->
20 android:id="@+id/imageView2" <!--设置ID-->
21 android:layout_width="400dip" <!--设置宽度-->
22 android:layout_height="400dip " <!--设置高度-->
23 android:src="@drawable/bbb" /> <!--添加图片-->
24 <TextView <!--文本视图控件-->
25 android:id="@+id/textView5" <!--设置ID-->
26 android:layout_width="wrap_content" <!--宽度自身决定-->
27 android:layout_height="wrap_content" <!--高度自身决定-->
28 android:text="内容简介" <!--设置内容-->
29 android:textSize="30dip" <!--设置字体大小-->
30 android:textcolor=”@color/white”/> <!--设置颜色-->
31 <TextView <!--文本视图控件-->
32 android:id="@+id/textView6" <!--设置ID-->
33 android:textSize="20dip" <!--设置字体大小-->
34 android:layout_width="wrap_content" <!--宽度自身决定-->
35 android:layout_height="wrap_content"/> <!--高度自身决定-->
36 android:textcolor=”@color/white”/> <!--设置颜色-->
37 </LinearLayout>
38 </ScrollView>
该界面的布局比较简单,在一个充满整个屏幕的ScrollView控件中放置了一个LinearLayout控件,在LinearLayout控件里面放置了TextView和ImageView。由于篇幅有限只介绍其中一种选择下拉列表选项时所跳转到Activity的配置文件的开发。
(2)完成了配置文件scrub.xml的开发后,下面将要开发的是选择下拉列表选项时跳转到的Activity对应的类ScrubActivity的开发,其代码如下。
1 package com.bn.sample2_6;
2 ……//该处省略了部分类的导入代码,读者可自行查看随书光盘中的源代码
3 public class ScrubActivity extends Activity{ //继承Activity
4 @Override
5 protected void onCreate(Bundle savedInstanceState){ //重写方法
6 super.onCreate(savedInstanceState); //调用父类方法
7 setContentView(R.layout.scrub); //设置布局文件
8 String str="/sdcard/bbb.txt"; //设置读取文本路径
9 String result=getString(str); //获取文本
10 TextView tv=(TextView)findViewById(R.id.textView6); //获得TextView
11 tv.setText(result);} //设置内容
12 private String getString(String str){ //获取文本方法
13 String result=null;
14 try{
15 InputStream it=getAssets().open("youxi.txt"); //读取文件
16 byte[]bb=new byte[it.available()]; //设置大小
17 it.read(bb); //读取内容放到bb数组里面
18 it.close(); //关闭IO流
19 result=new String(bb,"GBK"); //获取的内容转换成中文
20 }catch(Exception e){
21 Toast.makeText(this,"找不到指定的文件",
22 Toast.LENGTH_SHORT).show();} //无法读取文件时响应
23 return result;}} //返回文本
第6~11行为初始化界面。其中第6~9行为设置布局界面和获取添加的文本,第10~11行为获取TextView对象后添加内容。
第12~23行为获取文本的方法。其中第15~19行为获取文件然后新建一个byte数组,把内容读到byte数组里面,然后转换成字符串返回。
(3)完成了选择下拉列表选项时跳转到的Activity对应的类ScrubActivity的开发后,下面将要介绍的是主Activity对应的类ActionBarEx3Activity的开发,其代码如下。
1 package com.bn.sample2_6;
2 ……//该处省略了部分类的导入代码,读者可自行查看随书光盘中的源代码
3 public class ActionBarEx3Activity extends Activity{ //继承Activity
4 @Override
5 public void onCreate(Bundle savedInstanceState){
6 super.onCreate(savedInstanceState);
7 setContentView(R.layout.main); //设置布局界面
8 ActionBar ac=getActionBar(); //获得ActionBar对象
9 ac.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); //启用导航功能
10 SpinnerAdapter mSpinnerAdapter = ArrayAdapter . createFromResource (
11 this , R.array.action_list,
12 android.R.layout.simple_spinner_dropdown_item ); //创建SpinnerAdapter
13 OnNavigationListener mOnNavigationListener=new OnNavigationListener(){
14 public boolean onNavigationItemSelected(int arg0, long arg1){
15 if(arg0==1){ //选择第一个选项
16 Intent it=new Intent(ActionBarEx3Activity.this,ScrubActivity.class);
17 ActionBarEx3Activity.this.startActivity(it); //发送一个Intent跳转到Scrub
Activity
18 }else if(arg0==2){ //选择第二个选项
19 Intent it=new Intent(ActionBarEx3Activity.this,SweepActivity.class);
20 ActionBarEx3Activity.this.startActivity(it); //发送一个Intent跳转到Sweep
//Activity
21 }else if(arg0==3){ //选择第三个选项
22 Intent it=new Intent(ActionBarEx3Activity.this,SelectedActivity.class);
23 ActionBarEx3Activity.this.startActivity(it);} //发送一个Intent 跳转到Selec
//tedActivity
24 return false;}};
25 ac.setListNavigationCallbacks(mSpinnerAdapter,
26 mOnNavigationListener);}} //为下拉列表设置回调
第8~12行为获得一个ActionBar对象后启用列表导航模式及创建一个SpinnerAdapter对象为列表提供内容和布局。
第13~26行为用匿名内部类实现OnNavigationListener接口,为每一个选中的选项发送一个Intent来跳转到相应的界面。