《Android应用开发从入门到精通》——第2章,第2.3节创建第一个Android项目-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

《Android应用开发从入门到精通》——第2章,第2.3节创建第一个Android项目

简介:

本节书摘来自异步社区《Android应用开发从入门到精通》一书中的第2章,第2.3节创建第一个Android项目,作者 卢海东,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.3 创建第一个Android项目
Android应用开发从入门到精通

2.3.1 创建新项目
打开Eclipse,选择 File→New→Android Application Project。如果没有Android Application Project这一条,这时可以选择Other找到Android Application Project。

进入New Project对话框,分别进行如下设置,如图2.7所示。


8e3ea86922770a8c19a231772a9218027fd27cf7

词条解释如下。

Project Name 包含这个项目的资料夹的名称。
Application Name显示在应用程序上的标题。
Package Name包(Package)名称,Java的习惯是用套件名称来区分不同的类别(class)。依照专桉的不同,我们会起不同的路径名称。
Create Activity是否建立这个是项目的主要类别,勾选后可以指定这个类别的名称。这个类别是一个Activity类别的子类别。我们可以在「Activity」中启动程序和控制程序流程,或是根据需要控制荧幕、界面。
Build Target选择用来编译专桉的SDK版本。当选定了Build Target后,开发工具会在Min SDK Version栏位中自动填入对应的值。
Min SDK Version本应用程序所支持的最低SDK版本代号。
下面点击Next,下一个界面是创建项目的一些配置,全部保持默认配置就好,如图2.8所示。

接着点击Next进入到启动图标的配置界面,在这里配置的图标就会是你的应用程序安装到手机之后显示的图标,如图2.9所示。


7f4dd4b368d7b95ac0a610f7bd41f981b5ea2d5f

如果程序的Logo还没设计好,这里就先不配置,直接点击Next,到项目里面再配置启动图标。

然后跳转到的是创建Activity界面,在这个界面可以选择一个你想创建的Activity类型,这里我们就选择Blank Activity了,如图2.10所示。

继续点击Next后,需要给刚刚选择的Blank Activity起一个名字,我们选择默认就好,如图2.11所示。


ca38fa97327d2380808af9979805fc95c2854b41

然后点击Finish,项目创建完成。你会发现在Eclipse中创建出工程appcompat_v7和HelloWorld,appcompat_v7工程在Android 5.0(API 21)之前是没有的,它是为了让低版本的系统支持Android 5.0的新特征而存在的,因此我们叫它支持库,本节不对它进行详细 讲解。

由于ADT会自动生成了很多东西,现在不需要写任何代码,HelloWorld项目就已经可以运行。在以后创建项目时,若没有特别说明都是按照这种方式进行创建。

2.3.2 程序工程架构图
创建完工程以后,我们看看Eclipse的Package Explorer窗口,窗口展示如图2.12所示。

图2.12是HelloWorld工程结构图,下面我们一一介绍这几个文件的内容。


77686ac5c5d1b5816bf0e6ed9c7622de9df734bf

src源代码目录:该目录存放Android应用程序所有的源代码。该目录中包含不同的包,包中对应开发的源程序,开发的主要精力都集中在开发src目录下的内容。
gen文件夹目录:存放了Eclipse的ADT插件自动生成的R.java文件。R.java定义了一个R类,它包含了应用中用户界面、图像、字符串等各种资源与之相对应的资源编号(id),这些资源编号都是系统自动生成的,即有一个资源对象,系统就为此在R类中生成相应的资源编号,好比一本字典。
注意,Android应用程序中通过R类别来实现对资源的应用。同时,编译器也会查看这个资源列表,没有使用到的资源就不会编译进去,为手机应用程序节省 空间。
res资源目录:该目录下定义了drawable、layout、menu和values目录,下面对这几个目录进行介绍。
drawable目录:该目录下有drawable-hdpi、drawable-ldpi、drawable-mdpi 3个文件夹分别用来存放不同分辨率的图片资源,用于不同分辨率的手机的开发。
layout目录:该目录下包含了所有使用XML格式的界面布局文件。一般一个用户界面调用一个布局文件。
values目录:该目录包含了使用XML格式的参数描述文件,可以在此添加一些额外的资源如字符串(string.xml)、颜色(color.xml)、样式(style.xml)和数组(arrays.xml)等。主要用于在代码中通过R类来调用它们,这样就可将代码和资源分开管理,便于维护。
project.properties:文件就是通过一行代码指定了编译程序时所使用的SDK版本。我们的HelloWorld项目使用的是API 23,也可以在这里改成其他版本。
除了以上文件夹外,还有AndroidManifest.xml文件,它是Android项目的配置文件,在程序中定义的四大组件都需要在这个文件里注册。另外还可以在这个文件中给应用程序添加权限声明、安全控制等,也可指定程序最低兼容版本和目标 版本。
下面分析一下HelloWorld项目究竟是怎么运行起来的吧。首先打开AndroidManifest.xml文件,查看AndroidManifest.xml文件的如下内容:

     < activity
     android:name=".MainActivity"
     android:label="@string/app_name" >
     < intent-filter >
     < action android:name="android.intent.action.MAIN" / >
     < category android:name="android.intent.category.LAUNCHER" / >
     < /intent-filter >
     < /activity >

这段代码表示对MainActivity这个Activity进行注册,没有在AndroidManifest.xml里注册的Activity是不能使用的。其中intent-filter里的两行代码,



表示MainActivity是这个项目的启动Activity,首先启动的就是这个Activity。后续章节我们会详细讲解。

2.3.3 HelloWorld程序架构解析
首先我们来看看应用程序的启动Activity,MainActivity.java文件代码如下。

    public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
       }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.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();
    if (id == R.id.action_settings) {
    return true;
          }
     return super.onOptionsItemSelected(item);
        }
    }

类MainActivity继承自类ActionBarActivity,AndroidBarActivity是支持库appcompat_v7中提供的,是为了让Android SDK 3.0以下版本支持actionbar,因为系统Activity类提供的actionbar只有在Android 3.0(API 11)以上才可以使用,所以为了方便讲解,本书在没有特别说明时我们都将ActionBarActivity类替换为Activity类。

    public class MainActivity extends Activity {
      ......
    }

前面讲解过Activity是Android提供的四大组件之一,它为用户提供一个可视的界面,方便用户操作。每个Activity会提供一个可视的View(使用setContentView设置)。下面我们看MainActivity中包含的方法,MainActivity中有三个方法,onCreateOptionsMenu()这个方法是用于创建菜单的,onOptionsItemSelected()是为了相应菜单消息,可以先无视它们,主要看下onCreate()方法。onCreate()方法是一个Activity创建时必定要执行的方法,其中只有两行代码,第一行是调用了父类的onCreate()方法,第二行是设置View的代码,参数“R.layout. activity_main”,前面说过通过R类来调用res中的资源文件,函数setContentView (R.layout. activity_main):表示当前Activity中的View加载的是res/layout/activity_main.xml中的文件,称activity_main.xml为布局文件,代码如下所示。

    xmlns:androidd="http://schemas.android.com/apk/res/Android"
xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent" < !--定义当前视图在屏幕上可以消费的宽度,match_parent即填充整个屏幕。-->
    android:layout_height="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"
    tools:context =" com.example.helloworld.MainActivity" < !--这一句不会被打包进APK。说明当前的RelativeLayout所在的渲染上下文是MainActivity -->
< TextView < !--TextView 是Android中的一个控件,用于显示--> 
        android:layout_width="wrap_content" < !--随着文字栏位的不同而改变这个视图的宽度或者高度。
        -->android:layout_height="wrap_content"
android:text="@string/hello_world" />

词条解释如下。

相对布局RelativeLayout允许子元素指定它们相对于其父元素或兄弟元素的位置,这是实际布局中最常用的布局方式之一,详细内容请看4.2.2节。
xmlns:android这是一个XML命名空间,告诉Android开发工具你准备使用Android命名空间里的一些通用属性。在所有Android XML设计文件中最外层的标记必须使用这个,它的值也一定是"http://schemas.android.com/apk/res/android"。
xmlns:tools不会被打包进APK,一般是用于设置ADT的一些参数,是xml的命名空间,可以理解为语法判断器。
tools:context用于说明当前的RelativeLayout所在的渲染上下文是MainActivity。
android:layout_width设置界面元件的宽度,值一般是“fill_parent”,“wrap_content”,“match_parent”。“fill_parent”和“match_parent”都表示都是填满整个父窗口,在Android 2.2(API 8)就开始使用“match_parent”替换“fill_parent”,“wrap_content”表示随着控件文字数的不同而改变这个控件的宽度或者高度。
android:layout_height设置界面元素的高度。赋值和layout_width相同。
android:widt是定义控件的宽度,当然这个宽度也是和android:layout_width配合起来作用的,如果android:layout_width="match_parent"的话,那么设置Android:width是没有意义的,android:width 的值是"dp"类型的整数值。
由于刚开始实际接触到Android应用程序,先从简单的开始:首先我们找出“Hello world!”字符串定义在什么地方。在上面的代码找到“android:text="@string/hello_world"” android:text表示控件显示的内容,但是和程序运行后显示“Hello world!”的不一样,其实真正的“Hello world!”字符串也不是在布局文件中定义的。Android不推荐在程序中对字符串进行硬编码,更好的做法一般是把字符串定义在res/values/strings.xml里,然后可以在布局文件或代码中引用。那我们现在打开strings.xml看一下,里面的内容如下:

    < ?xml version="1.0" encoding="utf-8"?>
    < resources>
    < string name="app_name">HelloWorld
    < string name="hello_world">Hello world!
       < string name="action_settings">Settings
    < /resources>

这是为了便于项目国际化,能够容易将程序中用到的字符串转换成其他语言。

再来看一下如何去使用strings.xml资源。比如刚刚在strings.xml中找到的“Hello world!”字符串,我们有两种方式可以引用它:

在代码中通过R.string.hello_world可以获得该字符串的引用。

在XML中通过@string/hello_world可以获得该字符串的引用。

基本的语法就是上面两种方式,其中string部分是可以替换的,如果是引用的图片资源就可以替换成drawable,如果是引用的布局文件就可以替换成layout,HelloWorld项目的图标就是在AndroidManifest.xml中通过android:icon="@drawable/ic_launcher"来指定的,ic_launcher这张图片就在drawable文件夹下,如果想要修改项目的图标就可以直接将其替换。

AndroidManifest.xml是每个Android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities、services等),他们各自的实现类,各种能被处理的数据和启动位置。除了能声明程序中的Activities、ContentProviders、Services和Intent Receivers,还能指定permissions和instrumentation,下面我们一起来看看HelloWorld的AndroidManifest.xml文件。

    < ?xml version="1.0" encoding="utf-8"?>
    < manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.helloworld"
    Android:versionCode="1"
    Android:versionName="1.0" >
    < uses-sdk
    Android:minSdkVersion="8"
    Android:targetSdkVersion="23" />
    < application
    Android:allowBackup="true"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >
    < activity
    Android:name="com.example.helloworld.MainActivity"
    Android:label="@string/app_name" >
    < intent-filter>
    < action Android:name="Android.intent.action.MAIN" />
    < category Android:name="Android.intent.category.LAUNCHER" />
    < /intent-filter>
    < /activity>
    < /application>
    < /manifest>

解释词条如下。

xmlns:android:定义android命名空间,一般为http://schemas.Android.com/ apk/res/android,这样使得Android中各种标准属性能在文件中使用。
Package:指定本应用内Java主程序包的包名,它也是一个应用进程的默认名称。
android:versionCode:开发者用的内部版本号,一般使用流水号,该属性是可选的。
android:versionName:是给使用者看的版本号,你可以将你的APP版本号设置为1.0版,后续更新版本设置为1.1、2.0版本等,该属性是可选的。
application:主要标签定义了所有这个应用程序用到的Activity、服务等信息。
“application”标签中的android:icon =“@drawable/ic_launcher”表示应用程序图示的资源档存在于“res/drawable/icon”中,图示的大小必须超过64x64像素(Pixel)。
“application”标签中的“android:label”属性可用来指定应用程序名称。
程序中用到的Activity,都定义在“application”标签中分别由Activity标签来标识,Activity是Android应用程序与使用者互动的主要元素。
“activity"标签的“android:name”属性,指出了这个Activity 所对应的类名(class)。"activity"标签中的“android:label”属性可用来指定应用程序将显示在Activity画面上方的名称。也可以在程序码中透“setTitle(名称)”来动态修改。
下面我们将HelloWorld工程安装到上节中创建的模拟器中,在Eclipse中选择HelloWorld项目单击右键,如图2.13所示App就直接安装在模拟器中了。


ce85e519e2996b630b9f35e6ddc69ba68423f8e9

接着我们看看HelloWorld项目运行图,如图2.14所示。


79bdf99a264825e750f71d545bb08e13b5d730f7

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: