Android入门—— Hello, world 解析

1 在Eclipse的Android工程目录中有一个res目录,这是资源目录,里面有drawable, layout, valuse三个字目录。layout里面放着应用程序画面布局文件*.xml,当前的布局文件是缺省生成的main.xml,我们双击打开。如果你安装的是我之前说对应工具版本的话,会看到如下画面。

 

这下是不是豁然开朗了? 原来那个"Hello world"早已由缺省的main.xml生成好了

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >
  7. <TextView  
  8.     android:layout_width="fill_parent" 
  9.     android:layout_height="wrap_content" 
  10.     android:text="@string/hello"
  11.     />
  12. </LinearLayout>

这是Android自动生成的一个xml所产生的界面。熟悉xml的朋友应该对这个xml文件的描述不陌生的。

<?xml version="1.0" encoding="utf-8"?> 不用去太在意。

<LinearLayout>是指当前的layout是线性布局的。 其实我更愿意理解layout为图层,呵呵,可能是photoshop玩多了。里面后三个属性设置分别是线性分布的方向,该图层的宽度,高度。
<TextView>就是一个Android里面一个标准的文本显示框,相对于windows程序的文本框控件。windos里大部分"控件"在Android里都被当作view类,这个记住不搞混就行。或者忘记windows开发的东西吧。
这里注意一下:android:text="@string/hello" 表示该<TextView>的文本内容取自string里面定义的hello。
那么string在哪里? 在values里的string.xml打开它,是不是看到了hello对应的值是"Hello World, HelloNoXML"。

 

2 既然确定了程序中显示的"Hello World, HelloNoXML"是因为Android缺省生成的main.xml所致,那么Android程序是怎么使用他的?现在看我们的代码。

  1. public class HelloWorld extends Activity {
  2.     /** Called when the activity is first created. */
  3.     @Override
  4.     public void onCreate(Bundle savedInstanceState) {
  5.         
  6.         super.onCreate(savedInstanceState);
  7.         
  8.         setContentView(R.layout.main);
  9.     }
  10. }

看到 setContentView(R.layout.main); 是不是能猜到什么了? 他的意思就是给当前的Activity设置视图,这个视图其实就是前面所看到的main.xml,但这里是用 R.layout.main 来索引的。

 

在源代码package下,我们可以看到R.java 文件,这个文件是Android 的程序和资源之间联系的桥梁。该文件是Android自动生成的,每当你建立、删除、修改一个资源文件或资源项时,Android会根据你的动作而自动更变 R.java 代码内容,所以你不用也不应该手工修改它。当你要使用资源时,就把资源当成一个类的静态公用成员变量来使用,如:你想用layout里面的main.xml时,那就用R.layout.main来索引(注意不要后缀)。

当你写代码时,借助于eclipse的自动补完功能,你就能很快找到你想要的资源,这也是Android为何要有一个R.java文件的原因。当然到后面要根据 R.layout.main 来找到对应xml文件就不那么方便了,我相信eclipse应该将会有这个功能。

 

3  我们再来发挥一下,改改代码。

在layout下再生成一个myLayout.xml,把main.xml的内容copy过来。然后把android:text="@string/hello" 改成 android:text="Ha, hello world" 。如下所示:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >
  7. <TextView  
  8.     android:layout_width="fill_parent" 
  9.     android:layout_height="wrap_content" 
  10.     android:text="Ha, hello world"
  11.     />
  12. </LinearLayout>

 

然后再把setContentView(R.layout.main) 改为setContentView(R.layout.myLayout)。

  1. public class HelloWorld extends Activity {
  2.     /** Called when the activity is first created. */
  3.     @Override
  4.     public void onCreate(Bundle savedInstanceState) {
  5.         
  6.         super.onCreate(savedInstanceState);
  7.         
  8.         setContentView(R.layout.myLayout);
  9.     }
  10. }

运行一下,看看结果。这下是不是有更感性的认识了?


4  好现在解释一下整个代码

public class HelloWorld extends Activity {

我们的HelloWorld 派生于Activity。Activity:一个类,确切说是基类;每个Android程序都应该会有一个派生于Activity的子类;负责创建程序的界面窗口;与用户交互信息等等。

public void onCreate(Bundle savedInstanceState) {

该方法是一个回调方法,在程序开始运行时,系统自动第一个调用的方法。同时从@Override可以看出这是一个父类方法,子类需要对其做修正或扩展。

super.onCreate(savedInstanceState);

应用程序启动是个复杂过程,必须要完成一些类似系统初始化工作,该工作不应该由应用程序开发者关注,所以用super.onCreate()方法封装屏蔽起来,然后开发人员调用一下该方法,就相当于做了所有必要的初始化工作。然后就可在此基础做自定义的一些事。

setContentView(R.layout.myLayout);

接着,子类要完成本身所扩展的工作,本例就是显示myLayout.xml定义的视图。

 

好,感觉挺简单吧。

 

我想你肯定希望知道,如何采用硬编码的方式,即不用.xml文件的方式,来做一个真正的Hello world。

 

那么就请看下一篇吧。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值