按照博客的进程,今天应该进行程序编写啦,下面让我们开写一个简单的HelloWorld程序。
提示:这里对于如何使用Eclipse创建一个Android程序就不多讲啦,不会的同学可以去查阅相关文档。
- 程序清单文件hello_world.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:id="@+id/show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_alignParentTop="true"
android:text="@string/hello_world" /> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/show"
android:text="单击我"
android:onClick="clickHandler"/> </RelativeLayout>
上面XML文档的跟元素是RelativeLayout,它代表一个相对布局,在该界面布局里包含如下两个UI控件。
- TextView:代表一个文本框
- Button:代表一个普通按钮
①android:id:该属性指定了该控件的唯一标识,在Java程序中可以通过findViewById("id")来获取指定的Android界面组件。
②android:layout_width:指定该界面组件的宽度。如果该属性值为match_parent,则说明该组件与其父容器具有相同的宽度;如果该属性值为wrap_content,则说明该组件宽度取决于它的内容——能包裹它的内容即可。
③android:layout_height:指定该界面组件的高度。如果该属性值为match_parent,则说明该组件与其父容器具有相同的高度;如果该属性值为wrap_content,则说明该组件的高度取决于它的内容——能包裹它的内容即可。
2. 程序清单文件HelloWorldActivity.java
package org.crazyit.helloworld; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.*;
import android.widget.*; public class HelloWorldActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_world);
} @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;
} public void clickHandler(View source)
{
//获取界面ID为R.id.show的文本框
TextView tv=(TextView)findViewById(R.id.show);
//改变文本框的文本内容
tv.setText("Hello Android-你好现在时间为:"+new java.util.Date()); } }
对于上面的代码做如下分析:
- 设置该Activity使用hello_world.xml文件定义的界面布局作为用户界面。
- 定义了一个clickHandler()方法作为按钮事件处理方法——在处理方法中改变ID为R.id.show的文本框的内容。
3. 通过ADT或者真机运行应用(此处不再赘述)
4. Android应用结构分析
以上代码有两个疑问:
- findViewById(R.id.show);代码中的R.id.show是什么?从哪里来?
- 为何setContentView(R.layout.hello_world);代码设置使用hello_world.xml文件定义界面布局文件?
带着这些疑问我们进一步“追根究低”
找到我们创建的HelloWorld程序所在的目录:可以看到如下几个必要的文件夹
上面的文件结构中res目录,src目录、AndroidManifest.xml文件是Android项目必须的,其他目录、其他文件都是可选的。
- res目录存放Android项目的各种资源文件,比如子目录layout存放各种界面布局文件,values子目录则存放各种XML格式的资源文件,例如字符串资源文件:string.xml;颜色资源文件:colors.xml;尺寸资源文件:dimens.xml。drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi这4个子目录分别用于存放低分辨率、中分辨率、高分辨率、超高分辨率的4种图片文件。
- src目录只是一个普通的、保存Java源文件的目录。
- AndroidManifest.xml文件是安卓项目的系统清单文件,它用于控制Android应用的名称、图标、访问权限等整体属性。除此之外Android应用的Activity、Service、ContentProvider、BoradcastRecevier这4大组件都在该文件中配置。
- 除此之外还可以看到一个build.xml文件这是Android为该项目提供的一个Ant生成文件。如果没有该文件可以用切换到项目生成的跟目录敲入命令:android update project -n <项目名称> -p <项目所在的位置> 生成build.xml文件 ,如图
上图中HelloWorld为项目名称,“.”代表当前路径
- 在项目的生成目录中启动ant命令,下面对ant命令简单介绍一下
Ant是一个非常简答、易用的项目生成工具。对绝大部分Java开发者来说,使用Ant应该是一项基本的技能。现在可以登录到http://ant.apache.org/下载后在环境变量中配置后相关路径即可使用
- clean:清除项目生成的内容——也就是恢复原来的样子。
- debug:打包一个调试用的Android应用的APK包,使用debug key进行签名。
- release:打包一个发布用的Android应用的APK包。
- test:运行测试。要求该项目必须是一个测试项目。
- install:将生成的调试用的APK包安装到模拟器上。
- uninstall:从模拟器上卸载该应用程序。
先执行ant release命令来发布该项目,发布完成后到Hello World目录下出现了两个子目录。
①bin:该目录用于存放生成的目标文件,如Java的二进制文件、资源打包文件(.ap_后缀)、Dalvik虚拟机的可执行文件(.dex后缀)等。
②gen:该目录用于保存自动生成的、位于Android项目包下的R.java文件。上面我们编写Android程序代码时多次使用了R.layout.main、R.id.show、R.id.ok......现在明白R是什么了,它原来是Android项目自动生成的Java类。
- 自动生成的R类
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/ package org.crazyit.helloworld; public final class R {
public static final class attr {
}
public static final class dimen {
/** Default screen margins, per the Android Design guidelines. Customize dimensions originally defined in res/values/dimens.xml (such as
screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here. */
public static final int activity_horizontal_margin=0x7f040000;
public static final int activity_vertical_margin=0x7f040001;
}
public static final class drawable {
public static final int ic_launcher=0x7f020000;
}
public static final class id {
public static final int action_settings=0x7f080002;
public static final int button1=0x7f080001;
public static final int show=0x7f080000;
}
public static final class layout {
public static final int hello_world=0x7f030000;
}
public static final class menu {
public static final int hello_world=0x7f070000;
}
public static final class string {
public static final int action_settings=0x7f050001;
public static final int app_name=0x7f050000;
public static final int hello_world=0x7f050002;
}
public static final class style {
/**
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices. Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here. Base application theme for API 11+. This theme completely replaces
AppBaseTheme from res/values/styles.xml on API 11+ devices. API 11 theme customizations can go here. Base application theme for API 14+. This theme completely replaces
AppBaseTheme from BOTH res/values/styles.xml and
res/values-v11/styles.xml on API 14+ devices. API 14 theme customizations can go here.
*/
public static final int AppBaseTheme=0x7f060000;
/** Application theme.
All customizations that are NOT specific to a particular API-level can go here.
*/
public static final int AppTheme=0x7f060001;
}
}
同过R.java类中的注释可以看出,R.java文件是有aapt工具根据应用中的资源文件来自动生成的,可以包R.java理解成Android应用的资源字典。
aapt生成R.java文件的规则主要是如下两条:
①每类资源对应R类的一个内部类
②每个具体的资源对应于内部类的一个public static final int 类型的Field。
5、res目录说明
Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源。已/res/values/string.xml文件来说,该文件内容十分简单,它只是定义了一条条的字符串长量,如以下代码所示:
<?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">HelloWorld</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string> </resources>
上面的资源文件中定义了一个字符串常量,常量的值为HelloWorld,该字符串常量的名称为app_name。一旦定义了这份资源文件之后,Android项目允许分别在Java代码、XML代码中使用这份资源文件中的字符串资源。
①在Java代码中使用资源
为了在Java代码中使用资源,AAPT会为Android项目自动生成一个R.java文件,R类里为每份资源定义了一个内部类,其中每个资源项对应于内部类里一个int类型的Field。例如上面的字符串资源文件对应于R.java里面的内容:
public static final class string {
public static final int app_name=0x7f050000;
}
借助于AAPT工具自动生成R类的帮助,Java代码可以通过R.string.app_name来引用到“HelloWorld”字符串常量。
②在XML文件中使用资源
在XML文件中使用资源更加简单,只要按如下格式来访问即可:
@<资源对应的内部类的类名>/<资源项的名称>
例如我们要访问上面的字符串资源中定义的“HelloWorld”字符串常量,则使用如下形式来引用即可:@string/app_name
但有一种情况例外,当我们在XML文件中使用标示符时——这些标示符无须使用专门的资源进行定义,直接在XML文档中按如下格式分配标示符即可:
@+id/<标示符代码>
例如使用如下代码为一个组件分配标示符:
android:id="@+id/ok"
上面的代码为该组件分配了一个标示符,接下来就可以在程序中引用该组件了。
如果希望在Java代码中获取该组件,通过调用Activity的findViewById(R.id.ok)方法即可实现。
如果希望在XML文件中获取该组件,则可通过资源引用的方式来引用它,语法如下:
@id/<标示符代码>
6、Android应用的清单文件:AndroidManifest.xml
AndroidManifest.xml清单文件是每个Android项目所必需的,它是整个Android应用的全局描述文件。AndroidManifest.xml清单文件说明了该应用的名称、所使用的图标以及包含的组件等。
AndroidManifest.xml清单文件通常可以包含如下信息:
- 应用程序的包名,该包名将会作为该应用的唯一标识。
- 应用程序所包含的组件,如Activity、Service、BroadcastReceiver和ContentProvider等
- 应用程序兼容的最低版本。
- 应用程序使用系统所需的权限说明。
- 其他程序访问该程序所需的权限说明。
下面是一份简单的AndroidManifest.xml清单文件。
<?xml version="1.0" encoding="utf-8"?>
<!-- 指定该Android应用的包名,该包名可用于唯一的表示该应用 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.crazyit.helloworld"
android:versionCode="1"
android:versionName="1.0" >
<!-- 声明该应用本身需要打电话的权限 -->
<uses-permission android:name="android.permission.CALL_PHON" />
<!-- 声明该应用本身需要发送短信的权限 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<!-- 指定Android应用标签、图标 -->
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 定义Android应用的一个组件:Activity 该Activity的类为HelloWorld,并指定该Activity
的标签 -->
<activity
android:name="org.crazyit.helloworld.HelloWorldActivity"
android:label="@string/app_name" >
<intent-filter>
<!-- 指定该Activity是程序的入口 -->
<action android:name="android.intent.action.MAIN" />
<!-- 指定加载该应用时运行该Activity -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
应用程序权限清单文件权限说明:此处待续
创建第一个Android应用程序 HelloWorld的更多相关文章
-
❤️【Android精进之路-03】创建第一个Android应用程序竟然如此简单❤️
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文会重点介绍如何创建第一个Android应用,以及如何使用Android Studio进行调试 干货满满,建议收藏,需要用到时常看看.小伙伴们如 ...
-
第2章 开始入手 —— 01 创建第一个 Android 应用程序
创建一个新的 Android 项目 操作步骤: (1) 选择 File | New | Android Application Project ,弹出 New Android Application ...
-
使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字“Hello Android”,并将应用程序的名称更改为“FirstApp”。
需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字"Hello Android",并将应用程序的名称更改为"Firs ...
-
使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行
需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行 实现步骤: 打开 Android Studio,创建一个 Andr ...
-
Android:日常学习笔记(2)——分析第一个Android应用程序
Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...
-
创建第一个Android项目
目录 创建第一个Android项目 创建HelloWorld项目 选择模板 选择模板界面的英文翻译 配置项目 配置项目界面英文翻译及解释 配置项目界面的注意事项 Name的命名规范 Package n ...
-
3.创建第一个android项目
安卓开发学习笔记 1.安卓开发之环境搭建 2.SDK目录结构和adb工具及命令介绍 3.创建第一个android项目 1.打开Eclipse,选择File——>new——>others.. ...
-
认识Activity,创建第一个android应用-Hello Word
2016-04-05 配置好Java.eclipse和Android环境就花费了一天时间.下载SDK真是费了不少时间.现在终于找到解决SDK更新的好方法了(更新自己电脑上的hosts文件,就可以使用G ...
-
Android官方教程翻译(1)——创建第一个Android应用
转载请注明出处:http://blog.csdn.net/dawanganban/article/details/9822431 Building Your First App GETSTARTED ...
随机推荐
-
Android中实现多彩的霓虹灯
1.布局文件 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:androi ...
-
BZOJ 1257: [CQOI2007]余数之和sum
1257: [CQOI2007]余数之和sum Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 3769 Solved: 1734[Submit][St ...
-
c#超时锁定
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
-
C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法。
原文:C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法. 一般我们在撰写Windows Phone ...
-
Java UDP实现聊天功能代码
我以前经常写的是基于TCP的网络编程,由于TCP建立连接鼻血要经过三次握手连接,服务器端需要阻塞式等待客户端的连接.而UDP则是可以直接向目的地址的目的端口上发送数据包,由于它只负责发送出去就好,不管 ...
-
linux学习之路--(三)文件系统
一.文件系统 rootfs:根文件系统 FHS:linux /boot:系统启动相关的文件,如内核.initrd,grub(bootloader) /dev:设备文件:不存储内容,就是个访问入口 块设 ...
-
LeetCode 791. Custom Sort String
题目链接:https://leetcode.com/problems/custom-sort-string/description/ S and T are strings composed of l ...
-
jstat命令详解
Jstat是JDK自带的一个轻量级小工具.全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令 ...
-
【JavaScript】脚本
javascript: void((function() { var as = document.getElementsByTagName('a'); for (var i = 0, j = as.l ...
-
int类型转string类型c++
前言 使用VS的过程中,经常会用到需要将int类型数据转换为字符串类型,便于显示信息等. 实现方法 c++11标准中的to_string函数,在VS安装文件的include文件中生成的只读文件,使用起 ...