本节使用Android Studio创建第一个Android项目。首先打开Android Studio,第一次启动会弹出快速创建项目窗口,如图1-15所示。也可以通过单击“File”→“Open ”命令打开此窗口。
选择“Start a new Android Studio project ”选项,打开创建项目向导,在弹出的窗口中选择项目路径,输入项目名称“FirstApp”,如图1-44所示。在项目配置窗口,指定公司域名,如“neusoft.edu.cn”,如图1-45所示。在目标设备选择窗口,选择“Phone and Tablet”,并设置最低SDK版本,如图1-46所示。
再添加Activity窗口,选择Blank Activity,如图1-47所示。在后续项目中,可以根据需要选择不同的Activity。在Activity设置窗口设置Activity名称、布局名称和标题,取消选择“Use a Fragment ”复选框,如图1-48所示。单击“Finish”按钮后,初始化项目,如图1-49所示。
图1-44 选择项目路径和项目名称
图1-45 项目配置
图1-46 设置目标设备版本
图1-47 添加Activity
图1-48 定义Main Activity
图1-49 项目初始化
项目创建完成后,Android Studio的窗口如图1-50所示。左侧是项目架构,右侧是代码,读者也可以根据需要进行定制。
图1-50 项目窗口
(1)MainActivity.Java
MainActivity是项目的入口,继承AppCompatActivity,主要包括 onCreate()函数、onCreateOptionsMenu()函数和onOptionsItemSelected()函数,相关代码如下:
package cn.edu.neusoft.firstapp;
import Android.os.Bundle;
import Android.support.design.widget.FloatingActionButton;
import Android.support.design.widget.Snackbar;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.Toolbar;
import Android.view.View;
import Android.view.Menu;
import Android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Snackbar.make(view,"Replace with your own action",Snackbar.LENGTH_LONG)
.setAction("Action",null).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
//Handle action bar item clicks here.The action bar will
//automatically handle clicks on the Home/Up button,so long
//as you specify a parent activity in AndroidManifest.xml.
int id=item.getItemId();
//noinspection SimplifiableIfStatement
if(id==R.id.action_settings){
return true;
}
return super.onOptionsItemSelected(item);
}
}
onCreate()函数是在Activity初始化时调用的,通常情况下,我们需要在onCreate()中调用setContentView(int)函数填充屏幕的UI,一般通过findViewById(int)返回XML中定义的视图或组件的ID。子类在重写onCreate()方法时,必须调用父类的onCreate()方法,即super.onCreate(),否则会抛出异常。
需要特别注意的是,在onCreate()函数里要配置一些必要的信息,但并不是所有的事情都能在这里做。一个Activity启动调用的第一个函数就是onCreate,它主要负责Activity启动时一些必要的初始化工作,这个函数调用完后,这个Activity并不是已经启动了,或者是跳到前台了,而是还需要其他的大量工作。那么在一个Activity真正启动之前,任何相当耗时的动作都会导致Activity启动缓慢,特别是在onCreate里面耗时长的话可能导致极差的用户体验。
onCreateOptionsMenu函数用于初始化菜单,其中menu参数就是即将要显示的Menu实例。
onOptionsItemSelected函数用于菜单项被单击时调用,也就是菜单项的监听方法。
(2)activity_main.xml
activity_main.xml是MainActivity的布局文件,主要的控件在content_main.xml中定义,<include layout="@layout/content_main" />。
<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
android:layout_width="match_parent"
android:layout_depth="match_parent"
android:fitsSystemWindows="true"
tools:context="cn.edu.neusoft.firstapp.MainActivity">
<Android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_depth="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<Android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_depth="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</Android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
<Android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email" />
</Android.support.design.widget.CoordinatorLayout>
(3)content_main.xml
content_main.xml 定义了"Hello World!"TextView 控件。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
android:layout_width="match_parent"
android:layout_depth="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="cn.edu.neusoft.firstapp.MainActivity"
tools:showIn="@layout/activity_main">
<TextView
android:layout_width="wrap_content"
android:layout_depth="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
上述代码虽然看起来比较复杂,但均是在创建项目时自动生成的。
启动AVD后,单击Android Studio的运行按钮,如图1-51所示,弹出设备选择器。这里选择上面创建的AVD,若希望每次都使用相同设备运行该项目,勾选“Use same device for future launches”,如图1-52所示。运行效果如图1-2所示。
图1-51 单击运行按钮
图1-52 选择设备
首先来看manifests目录下的AndroidManifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="cn.edu.neusoft.firstapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="Android.intent.action.MAIN" />
<category android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
从以上代码中,可以看出Android配置文件采用XML作为描述语言,每个XML标签都有不同的含义,大部分的配置参数都放在标签的属性中。下面按照以上配置文件样例中的先后顺序来学习Android配置文件中主要元素与标签的用法。
AndroidManifest.xml配置文件的根元素,必须包含一个元素并且指定 xlmns:Android和package属性。xlmns:Android指定了Android的命名空间,默认情况下是“http://schemas.Android.com/apk/res/Android”;而package是标准的应用包名,也是一个应用进程的默认名称,本例中“cn.edu.neusoft.firstapp ”就是一个标准的Java应用包名。为了避免命名空间的冲突,一般会以应用的域名来作为包名。
Activity活动组件(即界面控制器组件)的声明标签,Android应用中的每一个Activity都必须在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。标签中常用的属性有:Activity对应类名android:name,对应主题android:theme等,其他的属性用法可以参考Android SDK文档学习。另外,标签还可以包含用于消息过滤的元素,当然还有可用于存储预定义数据的元素。
本例中MainActivity作为项目的主action和LAUNCHER,是整个程序的入口。MainActivity调用setContentView,加载布局文件进行显示。
项目中添加Activity时,可以选择不同类型的Activity,如图1-47所示,在第一个Android程序中,使用的是Blank Activity。Blank Activty集成了诸如Toolbar 、Floating Bar等控件。在实际项目开发中,如果不需要使用这些控件,或者准备自己手工添加,可以选择Empty Activity。
【例1-1】 下面创建HelloAndroid 项目,使用Empty Activity。
(1)新建项目:选择“Start a new Android Studio project ”选项,打开创建项目向导,在弹出的窗口中选择项目路径,输入项目名称“HelloAndroid”,如图1-53所示。在添加activity窗口,选择Empty Activity,如图1-54所示。
图1-53 选择项目路径和项目名称
图1-54 Empty Activity
(2)修改布局文件:在配置Activity窗口使用默认的Main Activity和activity_main的布局文件名称,如图1-55所示。创建项目后,项目窗口如图1-56所示。在activity_main.xml中修改显示文本android:text="Hello Android!",单击运行按钮,项目效果如图1-57所示。
图1-55 定义MainActivity
图1-56 项目窗口
图1-57 项目运行效果
(3)效果对比:对比1.3节中的FirstApp项目,HelloAndroid项目没有了Toolbar和FloatingBar,MainActivity.java和 activity_main.xml都比较简单,在后续项目中可以按需添加相关功能。
【说明】 本书在第4 章和第5 章主要介绍布局和控件,创建 Activity 时采用的是 Blank Activity,其他章节Activity 采用的是EmptyActivity。读者可以按照自己的习惯选择适合的Activity。