深入浅出Android-8-入门-获取标识ID

存取识别符号

在 上一章谈了 XML描述档中介面元件的各种「android:」开头的属性。要使用一个介面元件,第一件事就是定义出介面描述档。大部分的介面元件(如 LinearLayout、TextView)不需要在程式中作后续处理,因此可以直接描述。不过对于那些将在程式中被参考(reference)到的介 面元件(如按钮 Button、文字输入栏位 EditText),我们需要透过在 XML描述档中,定义该介面元件的「android:id」识别符号属性。之后在程式中所有与这个介面元件有关的操作,都能根据「android:id」 识别符号来在调用这个介面元件。

代码:
<EditText android:id="@+id/height"    />



前 面章节提过,写作时最好将 XML 描述档属性分行列出,以易于阅读(增加可读性)。而我们的范例却将 android:id 属性直接摆在 EditText 标签后。其实这么做同样是基于易于阅读的考量。当然你也可以将「android:id」属性分行列出,或是将「android:id」属性放在属性列表的 中间或最后头,这些作法都是允许的,本书中一律使用将 android:id 属性直接摆在介面元件标签后的写法。

android:id 属性的内容长得比较特别:

代码:
@+id/height



「height」 是这个介面元件的 android:id。以后的程式中会使用「R.id.height」来取得这个介面元件。「@+id」的意思是我们可以通过这个识别符号来控制所对应的 介面元件,「R」类别会自动配置一个位址给这个介面元件。 「R」类别的内容则可以透过查看 R.java 得知。
XML 描述档与 R.java 档

在 Android 系统中,我们使用 XML 来定义 UI。但是有些稍微有经验的开发者可能会有疑问:

「用 XML 来描述介面固然方便,但是对于手机程式来说,直接用 XML 档桉是不是太占空间了?」。

没 错,如果 Android 是直接使用 XML 来储存介面描述到手机上的话,一定会使用比起现在大的多的档桉空间。解决的方法是Android 并不直接使用 XML 档桉,而是透过 Android 开发工具,自动将 XML 描述档转换成资源档桉。一旦应用程式要使用某个介面或是任何种类的资源(字串、图片、图示、音效...),都使用索引来查询。

当你建立一个 BMI 新专桉,打开位于 「src/com/demo/android/bmi」 目录下的 「R.java」档,你可以看到如下的程式码:

代码:
    /* 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 com.demo.android.bmi;

public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040000;
}
}



在照着前一章新增了 XML 描述后,再次打开打开 「src/com/demo/android/bmi」 目录下的 「R.java」 档 ,你可以看到如下的程式码:

代码:
  /* 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 com.demo.android.bmi;

public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class id {
public static final int height=0x7f050000;
public static final int result=0x7f050003;
public static final int submit=0x7f050002;
public static final int suggest=0x7f050004;
public static final int weight=0x7f050001;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
public static final int app_name=0x7f040000;
}
}



我 们看到在 R.java 档桉中,分别有 attr (属性)、drawable (图片、图示)、id (识别符号)、layout (介面描述)、string (文字) 这几种资源型态,就 XML 描述档中的 id 来说,开发工具会根据 XML 描述档中指定的 id,生成对应的资源,并自动指定一个位址。

Google 官方文件是这么解释「R.java」档案的作用的:

A project's R.java file is an index into all the resources defined in the file. You use this class in your source code as a sort of short-hand way to refer to resources you've included in your project. This is particularly powerful with the code-completion features of IDEs like Eclipse because it lets you quickly and interactively locate the specific reference you're looking for.

The important thing to notice for now is the inner class named "layout", and its member field "main". The Eclipse plugin noticed that you added a new XML layout file and then regenerated this R.java file. As you add other resources to your projects you'll see R.java change to keep up.


有了「R.java」做中介,在 XML 描述档中,我们可以透过

@[类型]/[识别符号]

这样的语法来为某个介面元件提供识别符号,以供程式控制。

例如,我们可以用 「@+id/height」来为对应供输入身高数字的 EditText 元件提供识别符号。
将字串抽离 XML

当我们在 res 资料夹中新增各种一个 XML 档桉,或是一张图片时,开发工具会从 res 资料夹中手机集,并将各种资源整成一个索引,自动产生出 R.java 档。

透过这个特性,我们可以进一步加工我们的 XML 描述档,让介面更易于维护。

开启 res/values/strings.xml

原始的内容为

代码:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">BMI</string>
</resources>



上面只定义了一个字串「app_name」,用来表示应用程式名称(在之后讲解 AndroidManifest.xml 档桉时将会用到)。 我们看到表示字串的格式为

代码:
<string name="识别代号">文字叙述</string>



我们将上一章中的叙述抽取出来,整理进 strings.xml 档桉。

完整的 strings.xml 档桉如下:

代码:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">BMI</string>
<string name="height">身高 (cm)</string>
<string name="weight">体重 (kg)</string>
<string name="bmi_btn">计算 BMI 值</string>
<string name="bmi_result">你的 BMI 值是 </string>
</resources>



在 strings.xml 档桉中,我们在原本的 app_name 字串外,自行定义了另外几个字串。如果我们再次开启 「R.java」档,我们会发现档桉中的 string 类别中也自动索引了上面定义好的字串:

代码:
    public static final class string {
public static final int app_name=0x7f040000;
public static final int bmi_btn=0x7f040003;
public static final int bmi_result=0x7f040004;
public static final int height=0x7f040001;
public static final int weight=0x7f040002;
}



接着,我们把这些字串应用到之前定义好的 XML 描述档中。透过使用

@string/[识别符号]

这样存取 string 类型的格式,来取代 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/height"
/>
<EditText android:id="@+id/height"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:numeric="integer"
android:text=""
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/weight"
/>
<EditText android:id="@+id/weight"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:numeric="integer"
android:text=""
/>
<Button android:id="@+id/submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bmi_btn"
/>
<TextView android:id="@+id/result"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>
<TextView android:id="@+id/suggest"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>
</LinearLayout>


再次运行 Android 模拟器,我们看到与前一节完全相同的介面。但就介面而言,透过将描述字串统一集中在 「string.xml」 中,我们以后要修改介面时更有弹性了。

至此我们已经完成了 BMI 应用程式负责「显示 (View)」的部份。


新增 XML 文件


我们在前面都只修改到开发工具帮我们产生的档桉, 而事实上,我们所有在 「res」 目录中所做的修改,开发工具都会自动搜寻,将之整理到「R.java」中。因此我们也可以在「src/values」中建立自己的文字描述档桉。

我们这就在「res/values」目录中建立一个 「advice.xml」档,上面将包含 BMI 程式算出 BMI 值后将给予的建议文字,完整的档桉如下:

代码:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="advice_light">你该多吃点</string>
<string name="advice_average">体型很棒喔</string>
<string name="advice_heavy">你该节食了</string>
</resources>


打开「R.java」档,我们发现「advice_light」、「advice_average」、「advice_heavy」也已整理进「R.java」档的索引中,以供程式调用。

那么接下来,我们就开始进入到了解 Android 程式流程的部分吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值