Android 开发之旅:又见Hello World!

简介:



本文转自吴秦博客园博客,原文链接:http://www.cnblogs.com/skynet/archive/2010/05/11/1732208.html,如需转载请自行联系原作者——量变产生质变,如果你从第一篇一直看到了这篇,可以说这就是你的质变点之一。

回顾及展望

经过数篇对Android应用程序的原理的讲述,现在我们大概回顾一下。

至此,我们终于算是完全算是双脚步入Android开发的大门了,但我们现在还只能算是金字塔底端的那群人,还需要不断地实践、实践、再实践。而且上面所讲的是作为一个真正Android开发人员必须要深刻理解的东西,如果您还没有达到深刻的程度那请你回去再浏览一遍,然后跟着我的这个系列继续深入学习,在接下来的文章我将更多的是利用实例来解析这些东西。下面我再次用Hello World程序来分析一下Android应用程序,主要内容如下:

  • “Hello World!”显示浅析
  • “Hello World!”的手术(一)
  • “Hello World!”的手术(二)
  • “Hello World!”的手术(三)

1、“Hello World!”浅析

首先我们再次简单地新建一个Hello World项目,它的布局文件res\layout\main.xml的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
元素<TextView>的android:text就是我们在屏幕上显示的“Hello World, HelloWorld!”,android:text的值是“@string/hello”,它是如何在屏幕上显示“Hello World, HelloWorld!” 的呢?。

在main.xml文件中以这种格式:
@[package:]string/some_name (where some_name is the name of a specific string)
引用res/values/strings.xml文件中的字符串,其中some_name是要引用的字符串的名字。strings.xml文件代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, HelloWorld!</string>
<string name="app_name">HelloWorld</string>
</resources>
由此可见,上面那个<TextView>的android:text引用的字符串是“Hello World, HelloWorld!”。接着想象一下,“Hello World, HelloWorld!”何时加载显示的呢?

Note:这种<TextView>的text的值是存储在strings.xml中的,而不是硬编码的。这样的好处是,当我们在strings.xml中修改hello的具体值时,不需要在main.xml中修改。

我们来看下src目录下skynet.com.cnblogs.www包(就是新建Hello World项目时定义的包名)中的HelloWorld.java文件,代码如下:
package skynet.com.cnblogs.www;

import android.app.Activity;
import android.os.Bundle;

public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
可以看出在创建活动时,即void onCreate(Bundle saveInstanceState)中,在HelloWorld中重写了它,在该方法中首先调用了父类的onCreate方法且接着调用了setContentView(R.layout.main)方法。是的,就是在这个方法中,根据main.xml文件将其显示出来,因为R.layout.main是表示布局资源文件main.xml编译后的对象,Eclipse插件会自动在R.java文件中创建这个引用。main.xml中定义了<TextView>,然后根据它的android:text属性引用到strings.xml文件中的<string name="hello">Hello World, HelloWorld!</string>元素,然后将它显示到屏幕上。

活动的生命周期可以知道,任何一个活动启动的一个方法是onCreate()方法,在这里做一些初始化的工作,诸如创建视图、绑定数据列表等。在HelloWorld项目中,就是调用setContentView进行初始化工作,将Hello World, HelloWorld!显示到屏幕上。

至此,我们对Hello World的认识更加深入了一点!下面我们让拿起手术刀对它进行一个手术。

2、Hello World的手术(一)

我们将main.xml文件中的<TextView>元素删掉,取而代之用一个Button来显示“Hello World!”。代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"
/>
</LinearLayout>
其它的地方不用修改,直接运行即可!

默认HelloWorld

图1、修改之前的

ButtonHelloWorld
图2、修改之后的

从这个例子我们可以看出我们上节的分析是对的,接下来我们继续对它做一个手术。

3、Hello World的手术(二)

我们这次不用Button来显示“Hello World!”,我们这次用一个图片来显示。首先我们准备一张png的图片,如下:hello

图3、hello.png

接下来我们将它复制到, res/drawable-dhpi中。然后我们查看R.java文件我们会发现,R中自动加了一行:(关于R文件,你可以参考Android 开发之旅:HelloWorld项目的目录结构中的1.2、gen文件夹
/* 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 skynet.com.cnblogs.www;

public final class R {
public static final class attr {
}
public static final class drawable {
public static final int hello=0x7f020000;//这行是Android自动新加的
public static final int icon=0x7f020001;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}

drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)

(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)

(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。

删除刚才我们添加的<Button>元素,添加一个<ImageView>元素。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/hello"
/>
</LinearLayout>
运行之后,结果如下所示:

hello 图4、图片显示Hello World

我们看到上面的ImageView有一个id属性。其实,每个View对象都有一个关联的ID,来唯一标识它。当应用程序被编译时,这个ID作为一个整数引用。但是ID通常是在布局XML文件中作为字符串分配的,在元素的id属性。这个XML属性对所有的View对象可用且会经常用到。XML中的ID语法如下:android:id="@+id/my_button"

字符串前的@符号表示XML解析器应该解析和扩展剩下的ID字符串,并把它作为ID资源。+符号表示这是一个新的资源名字,它必须被创建且加入到我们的资源(R.java文件,R是Resource)。Android框架提供一些其他的ID资源。当引用一个Android资源ID时,你不需要+符号,但是你必须添加android包名字空间,如下:android:id="@android:id/empty"

4、Hello World的手术(三)

上面两个手术都是基于main.xml的,在布局资源文件中声明相应的控件并设置相关属性,如TextView、Button、ImageView等,然后在onCreate()方法中调用setContentView(R.layout.main)方法来输出。其实上面的几个实验我们都可以编程地进行,下面就以编程地用ImageView显示“Hello World!”,别的也是类似来完成。

首先,我们将main.xml文件中的<ImageView>删掉,且将res/values/strings.xml中的<string name="hello">Hello World, HelloWorld!</string>删掉(其实第3节,用图片显示就没有用到它);然后,在HelloWorld.java文件中 import android.widget.ImageView;且删掉onCreate()方法中调用setContentView(R.layout.main)方法,因为我们不需要根据main.xml布局资源文件来显示而是编程地Hello World。

接下来我们在onCreate()方法中声明一个ImageView对象,并设置它的图像资源,最后将这个ImageView对象传给setContentView()方法,代码如下:
package skynet.com.cnblogs.www;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;

public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ImageView imageHello=new ImageView(this);
imageHello.setImageResource(R.drawable.hello);
setContentView(imageHello);
}
}
运行之后,同样会得到Hello World的手术(二)的结果,只是图片的显示位置不太一样。在这里注意上面那行粗体代码,如果是TextView或者Button的话,应该调用setText()方法来设置”Hello World!”。

image图5、编程地显示Hello World!

Note:构建ImageView对象时传递了一个this参数,表示与当前上下文(context)关联。这个Context由系统处理,它提供诸如资源解析、获取访问数据库和偏好等服务。因为Activity类继承自Context,且因为你的HelloWorld类是Activity的子类,它也是一个Context。因此,你可以传递this作为你的Context给ImageView引用。

本系列的其它文章:


相关文章
|
7天前
|
存储 开发工具 Android开发
探索安卓开发:从新手到专家的旅程
【8月更文挑战第24天】在这个数字时代,安卓开发不仅仅是一个技能,它更像是一扇打开无限可能世界的大门。无论你是编程新手还是资深开发者,掌握安卓开发的精髓都能为你带来意想不到的机遇和挑战。本文将通过浅显易懂的语言和实际代码示例,引导你了解安卓开发的基础知识,探索其深层次的技术和应用,并激发你对这一领域的思考和热情。让我们一起踏上这段充满创新和发现的旅程吧!
|
2天前
|
测试技术 Linux Android开发
探索安卓开发之旅:从初学者到专家
【8月更文挑战第29天】本文是一篇为初学者和有一定经验的开发者准备的安卓开发指南。我们将从基础概念开始,逐步深入到高级主题,如自定义视图、性能优化等。无论你是刚刚入门,还是希望提升自己的技能,这篇文章都将为你提供有价值的信息和建议。让我们一起踏上这段激动人心的旅程吧!
|
1天前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
2天前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
1天前
|
XML 搜索推荐 Android开发
安卓开发中的自定义View组件实践
【8月更文挑战第30天】探索Android世界,自定义View是提升应用界面的关键。本文以简洁的语言带你了解如何创建自定义View,从基础到高级技巧,一步步打造个性化的UI组件。
|
2天前
|
设计模式 Java Android开发
探索安卓应用开发:从新手到专家的旅程探索iOS开发中的SwiftUI框架
【8月更文挑战第29天】本文旨在通过一个易于理解的旅程比喻,带领读者深入探讨安卓应用开发的各个方面。我们将从基础概念入手,逐步过渡到高级技术,最后讨论如何维护和推广你的应用。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的代码示例。让我们一起开始这段激动人心的旅程吧!
|
2天前
|
移动开发 搜索推荐 Android开发
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。
|
5天前
|
安全 Android开发 Swift
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。
|
7天前
|
IDE Java 开发工具
探索安卓开发之旅:打造你的第一款App
【8月更文挑战第24天】在这篇文章中,我们将一起踏上激动人心的安卓开发之旅。不论你是编程新手还是希望扩展技能的老手,本文将为你提供一份详尽指南,帮助你理解安卓开发的基础知识并实现你的第一个应用程序。从搭建开发环境到编写“Hello World”,每一步都将用浅显易懂的语言进行解释。那么,让我们开始吧!
|
9天前
|
IDE 开发工具 Android开发
探索iOS与安卓开发的差异:平台选择对项目成功的影响
【8月更文挑战第22天】在数字化时代,移动应用成为企业和个人展示创意、提供服务的重要工具。iOS和安卓作为两大主流平台,各自拥有独特的优势和限制。本文将深入探讨这两个平台在开发过程中的主要差异,以及这些差异如何影响项目规划、用户体验和市场策略。通过比较分析,旨在为开发者和企业决策者提供有价值的见解,帮助他们根据项目需求做出明智的平台选择。