1 在Eclipse的Android工程目录中有一个res目录,这是资源目录,里面有drawable, layout, valuse三个字目录。layout里面放着应用程序画面布局文件*.xml,当前的布局文件是缺省生成的main.xml,我们双击打开。如果你安装的是我之前说对应工具版本的话,会看到如下画面。
这下是不是豁然开朗了? 原来那个"Hello world"早已由缺省的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>
这是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程序是怎么使用他的?现在看我们的代码。
- 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);
- }
- }
看到 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" 。如下所示:
- <?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="Ha, hello world"
- />
- </LinearLayout>
然后再把setContentView(R.layout.main) 改为setContentView(R.layout.myLayout)。
- public class HelloWorld extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.myLayout);
- }
- }
运行一下,看看结果。这下是不是有更感性的认识了?
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。
那么就请看下一篇吧。