Android入门—— Hello, world 解析

    技术2022-05-12  12

    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。

     

    那么就请看下一篇吧。


    最新回复(0)