“安卓编程学习第二天”中提到的HelloWorld程序,会显示一个活动,在活动中显示Hello World!的信息,如图1所示。
图1 HelloWorld程序的活动
那么,是HelloWorld程序中的哪些代码“创造”了这样的一个程序呢?
1 MainActivity.java
在Eclipse主界面左侧的“Package Explorer”中,鼠标左键双击“Hello_World->src->com.exmple.hello_world->MainActivity.java”,则在主界面的右侧会显示该文件的内容,如图1-1所示。
图1-1 打开MainActivity.java
其中,Hello_World是项目名称,该名称在“安卓编程学习第二天”的2.2.1中设置;src是保存安卓应用程序源代码的文件夹;com.exmple.hello_world是包名称,该名称也是在“安卓编程学习第二天”的2.2.1中设置;MainActivity.java是活动的名称,该名称是在“安卓编程学习第二天”的2.2.5中设置的。
1.1 类所在包的指定
在“MainActivity.java”中,首先要指定类所在的包,即com.exmple.hello_world。
package com.exmple.hello_world;
1.2 类的指定
程序使用关键字“import”指定项目中包含的类,这些类都是在项目中要使用到的。
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
其中,android.os、android.app和android.view是包的名称,Bundle、Activity和Menu是相应包中包含的类。
1.3 活动界面布局的指定
程序的界面布局在MainActivity中指定,MainActivity是程序的主要类。
1 publicclass MainActivityextends Activity {
2 @Override
3 protectedvoid onCreate(Bundle savedInstanceState) {
4 super.onCreate(savedInstanceState);
5 setContentView(R.layout.activity_main);
6 }
7 }
第1行表示创建(定义)一个名为MainActivity的类,extends表示该类派生自Activity。第2行的@Override表示重载,即第3行的onCreate()方法是重载了父类Activity的onCreate方法;如果没有@Override则表示是自定义函数。
当活动第一次被创建时,就会调用onCreate()方法,在该方法中完成视图创建和列表数据绑定等动作。第4行表示在MainActivity的类的OnCreate()函数中,首先调用父类的onCreate()函数,super表示父类,savedInstanceState是onCreate()方法的变量。第5行表示调用MainActivity的setContentView()函数来显示程序界面布局,setContentView()方法的格式为
public void setContentView(int layoutResID)
其中,layoutResID表示程序界面布局文件的ID,R.layout.activity_main即为程序界面布局文件的ID,在“gen->com.example.hello_world->R.java”中定义,如图1-2所示。
图1-2 activity_main的定义
其中R是一个类,项目中添加的任何资源都会在该类中进行声明,R.layout.actvity_main表示界面布局资源在R类的layout子类中声明,activity_main即为“安卓学习第二天”2.2.5中设置的Layout Name,在本文的2中将介绍程序界面布局文件activity_main.xml。
当活动第一次被创建时,就会调用onCreate()方法,在该方法中完成视图创建和列表数据绑定等动作。
1.4 活动选项菜单的指定
活动的选项菜单也是在MainActivity中指定的,通过重载onCreateOptionsMenu()函数实现。onCreateOptionsMenu()是Activity的方法,其作用是初始化活动的标准选择菜单,该方法的定义格式如下:
public boolean onCreateOptionsMenu(Menu menu)
其中Menu是adroid.view包的接口,该接口用来管理菜单项。当选择菜单第一次显示时,调用该方法。以下代码对onCreateOptionsMenu()方法进行了重载,使其导入自定义的选项菜单。
1 @Override
2 publicboolean onCreateOptionsMenu(Menu menu){
3 getMenuInflater().inflate(R.menu.main, menu);
4 returntrue;
5 }
第3行的getMenuInflater()是Activity类的一个方法,该方法的返回值是获取到的MenuInflater类的对象。MenuInflater是android.view包的一个类,该类的作用是将菜单的XML文件转换为Menu对象。通过获取到的MenuInflater类的对象调用该类的inflate()方法,该方法的作用是把Menu对象与菜单的XML关联起来,其定义格式为
void inflate(int menuRes, Menu menu)
其中,menuRes表示菜单XML文件的ID,menu表示Menu对象。
第3行中的代码作用就是将主活动的选项菜单与自定义的菜单关联起来,其中menu是onCreateOptionsMenu()方法的参数,即为主活动的选项菜单,R.menu.main是自定义菜单XML文件的ID,在R.java中定义,如图1-3所示。
图1-3 R.menu.main的定义
从刚才的分析可以看出,在自定义的MainActivity类中重载Activity的onCreate()方法,用来导入界面布局文件;而重载onCreateOptionsMenu()方法用来导入菜单文件。接下来将分析界面布局文件和菜单文件的内容。
2 界面布局文件
鼠标左键双击“Hello_World->res->layout->activity_main.xml”文件,该文件即为界面布局文件。与1.3中setContentView()函数的参数对应,如图2-1所示。
图2-1 界面布局文件
在activity_main.xml文件中,主要关注其窗口控件对应的代码。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"/>
其中,<TextView/>表示在活动中有一个TextView窗口控件,android:layout_width和android:layout_height指定了窗口控件的宽度和高度,android:text指定了TextView窗口控件显示的内容。其中,wrap_content是一个内部静态整数类型的值,表示@string/hello_world表示在“res->values->strings.xml”中定义的名为“hello_world”的字符串,其值为“Hello world!”,如图2-2所示。
图2-2 hello_world的定义
3 菜单文件
在主活动界面中按下虚拟设备右侧的“MENU”按键,则会在主活动中显示菜单,如图3-1所示。
图3-1 活动菜单
鼠标双击“res->menu->main.xml”,右侧打开的即为菜单XML文件。main.xml对应1.4中提到的菜单XML文件。在main.xml中有如下代码
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
</menu>
其中<menu><item></menu>表示菜单中的项,android:title表示菜单项的内容,“@string/action_settings”表示在“res->values->strings.xml”中定义的名为“action_settings”的字符串,如图2-2所示,“action_settings”字符串的值是“Settings”。
4 配置文件
安卓应用程序项目的配置文件是AndroidManifest.xml文件。鼠标左键双击“Package Explorer”选项卡中Hello_World项目下的AndroidManifest.xml项,之后在右侧下部点击“AndroidManifest.xml”选项卡,即可显示AndroidManifest.xml文件内容,如图4-1所示。
图4-1 打开AndroidManifest.xml文件
在<application></application>中对MainActivity这个活动进行注册。
<activity
android:name="com.example.hello_world.MainActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
其中android:name指定了要注册活动的名称;android:label指定了活动的标题,该标题在res->values->strings.xml中定义,名称是“app_name”的字符串,如图2-2所示。<intent-filter></intent-filter>中指定了MainActivity为这个项目的主活动。
5 程序修改
可以对res->values->strings.xml中定义的字符串进行修改,如图5-1所示。
图5-1 修改后的程序界面