熟悉Android工程的目录结构以及相关文件
1.Android工程的目录结构
下面我们来看看Android工程的目录结构:
上图为我们创建好的Android工程,下面我们来为大家解释工程中各目录的含义:
src:存放Java源文件。
gen:自动生成目录。该目录中的R.java文件提供访问Android应用程序的各种资源所需的常量,存放着res目录某个资源的引用。不要试图手工修改R.java文件,该文件自动生成。BuildConfig.java | 检查你的代码,不断运行调试。
Android4.1:该文件夹下包含android.jar文件,这是一个Java 归档文件,其中包含构建应用程序所需的所有的Android SDK 库(如Views、Controls)和APIs。通过android.jar将自己的应用程序绑定到Android SDK和Android Emulator,这允许你使用所有Android的库和包,且使你的应用程序在适当的环境中调试。
Android Dependencies:新版ADT新增的目录。导入jar包的时候只需要在工程目录下新建libs文件夹,注意是libs不是lib,然后将第三方的jar复制进去,eclipse会自动将这个jar添加到Android Dependencies文件夹下,不必在通过BuildPath自己去修改了,也不需要ReferenceLibrary了。另外,如果多个工程有关联的话,比如A工程设置为IsLibaray,B工程要引入A工程的时候,也会自动将A工程编译生成的jar放到Android Dependencies文件夹下。
assets:存放资源,比如大容量视频文件,存放的资源不会在R.java文件中生成引用,会被打包到程序安装包里。
bin:文件夹包含应用程序所需的用于控件、组件或者需要引用的任何其他代码的可部署程序集。bin文件里面有一个apk文件,可以直接用来安装android项目。
libs:新版ADT新增的目录。导入jar包用的。
res:存放资源,存放的资源会在R.java文件中生成引用。
drawable-hdpi里面存放高分辨率的图片,如WVGA(480x800)、FWVGA(480x854)。【high】
drawable-ldpi里面存放低分辨率的图片,如QVGA(240x320)。【low】
drawable-mdpi里面存放中等分辨率的图片,如HVGA(320x480)。【medium】
drawable-xhdpi里面存放超高分辨率的图片。xhdpi是从Android2.2(API Level 8)才开始增加的分类。xlarge是从Android 2.3(API Level 9)才开始增加的分类。【extra high】
layout:存放应用中使用的界面(布局)文件,activity_main.xml相当于html或者jsp,自己也可以新建XXX.xml,结构需和activity_main.xml一致。
menu:菜单相关的文件。
values:存放应用中使用到的常量数据,比如按钮上的文字、颜色、尺寸数据等等。strings.xml文件名称可以是任意名称,可有多个结构相同的strings.xml。
values-v11:代表在API 11+的设备上,用该目录下的styles.xml代替res/values/styles.xml,其中API 11+代表android 3.0 +。
values-v14:代表在API 14+的设备上,用该目录下的styles.xml代替res/values/styles.xml,其中API 14+代表android 4.0 +。
anim:存放定义动画的XML文件。(自己手动创建)
xml:在Activity中使用getResources().getXML()读取该目录下的XML资源文件。(用到的时候自己手动创建)
raw:该目录用于存放应用使用到的原始文件,如音效文件等。编译软件时,这些数据不会被编译,它们被直接打包到程序安装包里。为了在程序中使用这些资源,可以调用getResources().openRawResource(ID),参数ID形式:R.raw.somefilename。(用到的时候自己手动创建)
AndroidManifest.xml:项目清单文件,存放应用中使用到的组件、权限等等,安装应用程序时此文件由操作系统读取。Android应用中四大组件:Activity、内容提供者、服务、广播接收者。
proguard-project.txt:代码混淆的配置文件。
project.properties:旧版本中的名字是default.properties,该文件说明本应用所使用的Android平台版本。
以上是关于Android目录结构的解释,下面就来看看目录中的AndroidManifest.xml文件的内容。
2.AndroidManifest.xml文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.click369.helloworld" ---------应用所在的包,四大组件必须存放在应用所在的包或者其子包中。
android:versionCode="1"---------应用的版本号,一般是从1开始,往后每发布一个新版本递增1。
android:versionName="1.0" >---------应用的版本名称,是一个string,用于显示给用户。在程序中可以通过PackageManager的getPackageInfo(java.lang.String, int)来获取版本信息。
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />--------最低兼容版本号、目标版本号。
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >--------android:icon=应用的图标;android:label=应用的标题(标签);android:theme=应用的样式。@代表R文件。
//定义activity组件
<activity
android:name=".MainActivity"-----activity类名,此时可以省略前面的“.”,但是类在子包中时,不可以省略前面的“.”。“.”代表应用所在的包。
android:label="@string/title_activity_main" >----activity的标题(标签)。
<intent-filter>--------意图过滤器,类似于Filter的filter-mapping。
<action android:name="android.intent.action.MAIN" />-------需要进行过滤的条件,该Activity作为应用的入口类(只有一个入口类)。
<category android:name="android.intent.category.LAUNCHER" />---------需要进行过滤的类别,该Activity会出现在启动器列表中。
</intent-filter>
</activity>
</application>
</manifest>
上面是关于Android工程的项目清单文件的解释,下面我们给大家解释一下布局文件。
3.activity_main.xml
RelativeLayout允许子元素指定他们相对于其它元素或父元素的位置(通过ID指定)。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"------顶级元素(例如LinearLayout)的schema不能省略。这个是xml的命名空间,有了他,你就可以alt+/作为提示,提示你输入什么,不该输入什么,什么是对的,什么是错的,也可以理解为语法文件。或者语法判断器什么的。
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"--------宽度填充父元素,在此填充整个手机屏幕的宽度。
android:layout_height="match_parent" >---------高度填充父元素,在此填充整个手机屏幕的高度。
<TextView ------------类似于Label,此控件用于显示文字。
android:layout_width="wrap_content"----------该组件的宽度,包裹内容。
android:layout_height="wrap_content"---------该组件的宽度,包裹内容。
android:layout_centerHorizontal="true"-----该元素水平居中。
android:layout_centerVertical="true"------该元素垂直居中。 android:text="@string/hello_world"-------该组件上显示的文字。
tools:context=".MainActivity" />------tools:context="activity name"这一句不会被打包进APK。只是ADT的Layout Editor在你当前的Layout文件里面设置对应的渲染上下文,说明你当前的Layout所在的渲染上下文是activity name对应的那个activity,如果这个activity在manifest文件中设置了Theme,那么ADT的Layout Editor会根据这个Theme来渲染你当前的Layout。就是说如果你设置的MainActivity设置了一个Theme.Light(其他的也可以),那么你在可视化布局管理器里面看到的背景啊控件啊什么的就应该是Theme.Light的样子。仅用于给你看所见即所得的效果而已。
</RelativeLayout>
4.关于长度单位的理解。
px (pixels)像素不同设备显示效果相同,比如我们800*480的屏幕宽度就是800px。
dip或dp (device independent pixels)设备独立像素不同设备有不同的显示效果,这个和设备硬件有关,通常屏幕大时,density就大,屏幕小时,density就小。
屏幕实际分辨率为240px*400px时,densityDpi=120。
屏幕实际分辨率为320px*480px时,densityDpi=160。
屏幕实际分辨率为480px*800px时,densityDpi=240。
而dip与px之间的换算关系是:pixs=dips * (densityDpi/160),也就是说当densityDpi=160时,1dip=1px。
sp (scaled pixels — best for text size)比例像素,sp的大小取决于系统metrics.scaledDensity值大小。主要处理字体的大小,可以根据系统的字体自适应。
除了上面三个显示单位,此外还有几个不太常用的:
in (inches)英寸,in与px的换算关系:pixs = in*xdpi。
mm (millimeters)毫米,mm与px的换算关系:pixs = mm * xdpi * (1.0f/25.4f)。
pt 磅:(points)点,是一个标准的长度单位,1pt=1/72英寸,用于印刷业(基本用不到)。pt与px的换算关系:pixs = pt*xdpi * (1.0f/72);xdpi表示1英寸像素个数。
为了适应不同分辨率,不同的像素密度,推荐使用dip,文字使用sp。
获取屏幕的宽度和高度:
WindowManager wm=(WindowManager) this.getInstrumentation().getContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics mDisplayMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(mDisplayMetrics);
System.out.println("display.height="+wm.getDefaultDisplay().getHeight());
System.out.println("display.width="+wm.getDefaultDisplay().getWidth());
System.out.println("densityDpi=" + mDisplayMetrics.densityDpi);
System.out.println("xdpi=" + mDisplayMetrics.xdpi);
System.out.println("density=" + mDisplayMetrics.density);