“R.java”文件是在建立项目时自动生成的,这个文件是只读模式,不能更改。“R.java”文件是定义该项目所有资源的索引文件。“HelloWorld”项目的“R.java”文件的代码如下:
可以看到代码中定义了很多常量,这些常量的名字都与res文件夹中的文件名相同,这再次证明了“R.java”文件中所存储的是该项目所有资源的索引。有了这个文件,可以很快地找到要使用的资源,由于这个文件不能手动编辑,所以当在项目中加入了新的资源时,只需要刷新该项目,“R.java”文件便自动生成了所有资源的索引。
下面介绍资源文件中一些常量的定义,如“String.xml”,代码如下:
这个文件很简单,仅定义了3个字符串资源,因此,可以在“R.java”文件的代码中看到如下内容,即定义了app_name、action_settings和hello_world这3个常量,分别指向代码中的3个字符串资源:
那么如何在程序中使用定义的这些资源呢?首先,通过Context的getResources实例化一个Resources对象,然后通过Resources对象的getString方法取得指定索引的字符串,代码如下:
现在分析“HelloWorld”项目的布局文件(layout),首先打开“activity_main.xml”文件,代码如下:
下面仔细分析上面这段代码:
(1)〈LinearLayout〉:表示当前的布局为线性布局,关于布局会在后面详细介绍,现在只需要了解,在这个标签中的所有组件可以是水平排列的,也可以是垂直排列的。
(2)android:orientation:这个属性值决定了当前控件是水平排列的还是垂直排列的。这里vertical表示垂直排列。
(3)android:layout_width:定义当前控件在屏幕上占据的宽度,“fill_parent/match_parent”表示填充整个屏幕。
(4)android:layout_height:定义当前控件在屏幕上占据的高度,“fill_parent/match_parent”表示填充整个屏幕。
(5)wrap_content:控件的宽度或高度随着文字的大小不同而改变。
(6)layout_weight:该属性用于给线性布局中的多个控件的占比进行赋值,默认为0,表示需要显示多大的控件就占据多大的屏幕空间。如果大于0,则需要将父控件进行空间分割,分割的大小取决于每个控件的layout_weight值和当前屏幕布局的整体layout_weight值。举例来说,如果整体布局的layout_weight值为3,当前控件的layout_weight值为1,那么当前控件的大小就是整体布局大小的三分之一。(www.xing528.com)
在这里,布局中设置了一个TextView,用来配置文本标签Widget,其中设置的属性android:layout_width为整个屏幕的宽度,android:layout_height可以根据文字来改变高度,而android:text则设置了这个TextView要显示的文字内容,这里引用了@string中的hello_world字符串,即“String.xml”文件中的hello_world所代表的字符串资源。hello_world字符串的内容“Hello World!”就是在“HelloWorld”项目运行时看到的字符串。
下面分析“HelloWorld”项目的主程序文件“MainActivity.java”,代码如下:
主程序MainActivity类继承自Activity类,重写了void onCreate(Bundle saved Instance State)方法。在onCreate()方法中通过setContentView(R.layout.activity_main)设置Activity要显示的布局文件(\layout\activity_main)。
这就是在创建项目时没有进行编码就可以直接运行程序的原因。当然,这也是Android开发的特点,这样可以很轻松地将代码和UI(User Interface)分开,在国际化和程序维护方面有着巨大的作用。如果Android程序需要适应国际化,比如解决多国语言等问题,那么就可以定义不同语言的UI布局,在程序中装载这些布局文件即可,非常方便。当然,这需要开发者在开发时使用这种MVC框架,尽量减少使用“硬编码”。
延伸知识点
什么是程序设计时的硬编码和非硬编码(也称为“软编码”)?
这里先举个例子:在前面的代码中,设置TextView的文本内容的时候,代码是:“android:text="@string/hello_world"”,引用了“String.xml”文件中的hello_world变量所代表的字符串值,hello_world字符串的内容为“Hello World!”。这种方式就是软编码。如果想要改变项目运行时看到的字符串内容,只需要在“String.xml”文件中改变hello_world变量对应的值即可,非常方便。
那么如何使用硬编码的方式设置TextView的内容呢?看以下代码:
android:text="我是TextView"
要显示的内容被直接写在了程序里,而不是像前面一样使用一个变量名进行代替。
读者是不是觉得硬编码和软编码其实差别不大?要改变文本内容只需要修改一个地方就可以。可是,试想一下,如果程序里有成千上万相同的文本内容需要修改,采用硬编码就需要逐个手动修改,但采用软编码的时候只需要修改变量名对应的值就可以完成修改,非常方便。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。