还是回到 Eclipse 中,首先展开 HelloWorld 项目,你会看到如图 1.17 所示的目录结构。

图   1.17

一开始看到这么多陌生的东西,你一定会感到有点头晕吧。别担心,我现在就对上图中 的内容一一讲解,你很快再看这张图就不会感到那么吃力了。

1.    src

毫无疑问,src 目录是放置我们所有 Java 代码的地方,它在这里的含义和普通 Java 项目下的 src 目录是完全一样的,展开之后你将看到我们刚才创建的 HelloWorldActivity
文件就在里面。

2.    gen

这个目录里的内容都是自动生成的,主要有一个 R.java 文件,你在项目中添加的任 何资源都会在其中生成一个相应的资源 id。这个文件永远不要手动去修改它。

3.    assets

这个目录用得不多,主要可以存放一些随程序打包的文件,在你的程序运行时可以 动态读取到这些文件的内容。另外,如果你的程序中使用到了 WebView 加载本地网页 的功能,所有网页相关的文件也都存放在这个目录下。

4.    bin

这个目录你也不需要过多关注,它主要包含了一些在编译时自动产生的文件。其中
会有一个你当前项目编译好的安装包,展开 bin 目录你会看到 HelloWorld.apk,把这个 文件拷到手机上就可以直接安装了。

5.    libs

如果你的项目中使用到了第三方 Jar 包,就需要把这些 Jar 包都放在 libs 目录下,放
在这个目录下的 Jar 包都会被自动添加到构建路径里去。你可以展开上图中 Android 4.0、

Android Private
Libraries、Android Dependencies 这些库,其中显示的 Jar 包都是已经被

添加到构建路径里的。

6.    res

这个目录下的内容就有点多了,简单点说,就是你在项目中使用到的所有图片、布
局、字符串等资源都要存放在这个目录下,前面提到的 R.java 中的内容也是根据这个目 录下的文件自动生成的。当然这个目录下还有很多的子目录,图片放在 drawable 目录下, 布局放在 layout 目录下,字符串放在 values 目录下,所以你不用担心会把整个 res 目录 弄得乱糟糟的。

7.    AndroidManifest.xml

这是你整个 Android 项目的配置文件,你在程序中定义的所有四大组件都需要在这
个文件里注册。另外还可以在这个文件中给应用程序添加权限声明,也可以重新指定你 创建项目时指定的程序最低兼容版本和目标版本。由于这个文件以后会经常用到,我们 用到的时候再做详细说明。

8.    project.properties

这个文件非常地简单,就是通过一行代码指定了编译程序时所使用的 SDK 版本。 我们的 HelloWorld 项目使用的是 API 14,你也可以在这里改成其他版本试一试。
这样整个项目的目录结构就都介绍完了,如果你还不能完全理解的话也很正常,毕竟里

面有太多的东西你都还没接触过。不用担心,这并不会影响到你后面的学习。相反,等你学 完整本书后再回来看这个目录结构图时,你会觉得特别地清晰和简单。

接下来 我们一起 分析一下 HelloWorld 项目究 竟是怎么 运行起来 的吧。首先 打 开

AndroidManifest.xml 文件,从中可以找到如下代码:

<activity
android:name="com.test.helloworld.HelloWorldActivity"
android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category
android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

这段代码表示对 HelloWorldActivity 这个活动进行注册,没有在 AndroidManifest.xml 里 注册的活动是不能使用的。其中 intent-filter 里的两行代码非常重要,<action android:name=
"android.intent.action.MAIN" />和<category
android:name="android.intent.category.LAUNCHER" /> 表示 HelloWorldActivity 是这个项目的主活动,在手机上点击应用图标,首先启动的就是这 个活动。

那 HelloWorldActivity 具体又有什么作用呢?我在介绍 Android 四大组件的时候说过,

活动是 Android 应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的。因此

你在图 1.15 中看到的界面,其实就是 HelloWorldActivity 这个活动。那我们快去看一下它的 代码吧,打开 HelloWorldActivity,代码如下所示:

public class
HelloWorldActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.hello_world_layout);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this
adds items to the action
bar if it is present.
getMenuInflater().inflate(R.menu.hello_world, menu);

return true;

}

}

首先我们可以看到,HelloWorldActivity 是继承自 Activity 的。Activity 是 Android 系统提 供的一个活动基类,我们项目中所有的活动都必须要继承它才能拥有活动的特性。然后可以 看到 HelloWorldActivity 中有两个方法,onCreateOptionsMenu()这个方法是用于创建菜单的,
我们可以先无视它,主要看下 onCreate()方法。onCreate()方法是一个活动被创建时必定要执 行的方法,其中只有两行代码,并且没有 Hello world!的字样。那么图 1.15 中显示的 Hello world!
是在哪里定义的呢?

其实 Android 程序的设计讲究逻辑和视图分离,因此是不推荐在活动中直接编写界面的,
更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。你可以看到,在
onCreate()方法的第二行调用了 setContentView()方法,就是这个方法给当前的活动引入了一 个 hello_world_layout 布局,那 Hello world!一定就是在这里定义的了!我们快打开这个文件
看一看。

布 局 文 件 都 是 定 义 在 res/layout 目 录 下 的 , 当 你 展 开 layout 目 录 , 你 会 看 到

hello_world_layout.xml 这个文件。打开之后代码如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="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=".HelloWorldActivity" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

</RelativeLayout>

现在还看不懂?没关系,后面我会对布局进行详细讲解的,你现在只需要看到上面代码
中有一个 TextView,这是 Android 系统提供的一个控件,用于在布局中显示文字的。然后你
终于在
TextView 中看到了 hello world 的字样,哈哈终于找到了,原来就是通过 android:text= "@string/hello_world"这句代码定义的!咦?感觉不对劲啊,好像图
1.15
中显示的是 Hello
world!,这感叹号怎么没了,大小写也不太一样。

其实你还是被欺骗了,真正的 Hello world!字符串也不是在布局文件中定义的。Android
不 推 荐 在 程 序 中 对 字 符 串 进 行 硬 编 码 , 更 好 的 做 法 一 般 是 把 字 符 串 定 义 在
res/values/strings.xml 里,然后可以在布局文件或代码中引用。那我们现在打开 strings.xml 看 一下,里面的内容如下:

<resources>

<string name="app_name">Hello
World</string>

<string
name="action_settings">Settings</string>

<string name="hello_world">Hello
world!</string>

</resources>

这下没有什么再能逃出你的法眼了,Hello world!字符串就是定义在这个文件里的。并且
字符串的定义都是使用键值对的形式,Hello world!值对应了一个叫做 hello_world 的键,因此 在 hello_world_layout.xml 布局文件中就是通过引用了 hello_world 这个键,才找到了相应的值。

这个时候我无意中瞄到了这个文件中还有一个叫做 app_name 的键。你猜对了,我们还
可以在这里通过修改 app_name 对应的值,来改变此应用程序的名称。那到底是哪里引用了
app_name 这个键呢?打开 AndroidManifest.xml 文件自己找找去吧!

1.3.4    详解项目中的资源

如果你展开 res 目录看一下,其实里面的东西还是挺多的,很容易让人看得眼花缭乱,
如图 1.18 所示。

图   1.18

看到这么多的文件夹不用害怕,其实归纳一下,res 目录就变得非常简单了。所有以 drawable 开头的文件夹都是用来放图片的,所有以 values 开头的文件夹都是用来放字符串的, layout 文件夹是用来放布局文件的,menu 文件夹是用来放菜单文件的。怎么样,是不是突然 感觉清晰了很多?之所以有这么多 drawable 开头的文件夹,其实主要是为了让程序能够兼容
更多的设备。在制作程序的时候最好能够给同一张图片提供几个不同分辨率的副本,分别放
在这些文件夹下,然后当程序运行的时候会自动根据当前运行设备分辨率的高低选择加载哪 个文件夹下的图片。当然这只是理想情况,更多的时候美工只会提供给我们一份图片,这时 你就把所有图片都放在 drawable-hdpi 文件夹下就好了。

知道了 res 目录下每个文件夹的含义,我们再来看一下如何去使用这些资源吧。比如刚
刚在 strings.xml 中找到的 Hello world!字符串,我们有两种方式可以引用它:

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

2.    在 XML 中通过@string/hello_world 可以获得该字符串的引用。
基本的语法就是上面两种方式,其中 string 部分是可以替换的,如果是引用的图片资源

就可以替换成 drawable,如果是引用的布局文件就可以替换成 layout,以此类推。这里就不
再给出具体的例子了,因为后面你会在项目中大量地使用到各种资源,到时候例子多得是呢。 另 外 跟 你 小 透 漏 一 下 , HelloWorld 项 目 的 图 标 就 是 在 AndroidManifest.xml 中 通 过 android:icon="@drawable/ic_launcher"来指定的,ic_launcher 这张图片就在 drawable 文件夹下, 如果想要修改项目的图标应该知道怎么办了吧?

Android 程序目录介绍的更多相关文章

  1. Android sdk目录介绍

    android sdk目录介绍 build-tools 各版本SDK编译工具 docs 离线开发者文档Android SDK API参考文档 extras 扩展开发包,如兼容架包. platforms ...

  2. Android 程序目录及UI的简介

    Android程序的目录结构 src:源码的组织管理目录. gen:自动生成的目录,会生成一些重要的文件,如R.java,该目录一般不需要我们编写. assets:该目录文件不会被编译成二进制编码,多 ...

  3. Android 环境搭建与Android SDK目录介绍

    Android SDK下载和安装 本地已有合适版本Android SDK,则无需再下载,或者可以使用SDK Manager更新SDK: 没有SDK,则需要下载. 这里说一下使用SDK Manager下 ...

  4. Android 程序结构介绍

    创建好Android开发环境后,创建一个Android Project, 截图如下:

  5. Android NDK目录介绍

    交叉编译 在一个平台上去编译另一个平台上可以执行的本地代码 cpu平台---arm x86 mips 操作系统平台---windows linux mac os 原理 模拟不同平台的特性去编译代码 j ...

  6. Android开发:程序目录结构详解

    HelloWorld程序的目录结构概述 我们可以在文件夹中看到,HelloWorld程序的目录主要包括:src文件夹.gen文件夹.Android文件夹.assets.res文件夹. AndroidM ...

  7. android 源码目录介绍

    Android 4.0源码目录介绍|-- Makefile|-- bionic (bionic C库)|-- bootable  (启动引导相关代码)|-- build (存放系统编译规则及gener ...

  8. Android开发之 Android应用程序目录结构解析

    建立的HelloWorld的应用项目,其代码是由ADT插件自动生成的,形成Android项目特有的结构框架. 接下来让我带领大家解析一个Android程序的各个组成部分,这次我们拿一个Hello,Wo ...

  9. Android SDK目录含义介绍

    Android SDK目录的具体结构: 1.add-ons:该目录下存放第三方公司为Android平台开发的附加功能系统. 2.build-tools:编译工具.保存着一些通用工具,比如aapt.ai ...

随机推荐

  1. CasperJS断言

    特征 CasperJS具有一系列特征. 它具有一些列功能与断言,都是你期望一个好的测试API所具有的,包括: * assertTextExists (文本存在断言)* assertTitle (标题断 ...

  2. Apache+Tomcat+mod_jk实现负载均衡

    最近公司提出了负载均衡的新需求,以减轻网站的高峰期的服务器负担.趁空闲时间我就准备了一下这方面的知识,都说有备无患嘛.网上相关资料很多,但是太散.我希望可以通过这篇随笔,系统的总结. 一.Tomcat ...

  3. Sublime Text 使用介绍/全套快捷键及插件推荐

    如果说Notepad++是一款不错Code神器,那么Sublime Text应当称得上是神器滴哥.Sublime Text最大的优点就是跨平台,Mac和Windows均可完美使用:其次是强大的插件支持 ...

  4. Codeforces Round #533 (Div. 2) E - Helping Hiasat 最大团

    E - Helping Hiasat 裸的最大团,写了一种 2 ^ (m / 2)  * (m / 2)的复杂度的壮压, 应该还有更好的方法. #include<bits/stdc++.h> ...

  5. 【noip模拟赛3】贾老二的工件 (模拟)

    描述 贾老二有很多工件,最常见的工件都是长条形的,但其顶端是凹凸不平的,即不同位置的高度不同.现在贾老二有两个最常见的工件,他想将它们完全放入另一种罕见的可容纳高度不超过k的工件中,问该罕见的工件的最 ...

  6. Codeforces-1084C

    title: Codeforces-1084C date: 2018-12-13 16:02:04 tags: acm 刷题 categories: Codeforces 概述 好久没写博客了,,,最 ...

  7. python-tkinter学习实例

    在好友的邀请下,尝试用tkinter做一个卡牌的普通界面显示,正好练习下python的写法.  花了两天学习,写了两天代码,做了个最基本的demo.显示如下: 其中需要引入的第三方库主要有,PIL.P ...

  8. Python学习——Python 容器(列表,元组,字典,集合)

    列表: 列表非常适合利用顺序和位置定位某一元素,尤其是当元素的顺序或内容经常发生改变时.与字符串不同,列表是可变的. 你可以直接对原始列表进行修改:添加新元素.删除或覆盖已有元素.在列表中,具有相同值 ...

  9. Bzoj4818:生成函数 快速幂

    转来的题面:首先这题显然补集转化,就是用全部方案减去不含任何质数的方案.然后怎么做呢?考虑m比较小,我们能大力把<=m的质数全都筛出来.发现n很大,要么倍增要么快速幂......发现p相当小,所 ...

  10. Codeforces.997C.Sky Full of Stars(容斥 计数)

    题目链接 那场完整的Div2(Div1 ABC)在这儿.. \(Description\) 给定\(n(n\leq 10^6)\),用三种颜色染有\(n\times n\)个格子的矩形,求至少有一行或 ...