欢迎开始Android应用开发之旅!
本章节教你如何建立你的第一个Android应用程序。您将学到如何创建一个Android项目和运行可调试版本的应用程序。你还将学习到一些Android应用程序设计的基础知识,包括如何创建一个简单的用户界面,以及处理用户输入。
开始本章节学习之前,确保你已经
2.安装了开发环境
创建一个LinearLayout
1 创建Android新项目,从res/layout目录打开activity_my.xml文件。修改布局文件.
修改后结果如下:
res/layout/activity_my.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
</LinearLayout>
LinearLayout是ViewGroup的一个子类,用于放置水平或者垂直放置子视图的部件,由属性android:orientation
来设定方向。LinearLayout里的子布局按照XML里定义的顺序向显示在屏幕上。
另外的两个属性android:layout_width和android:layout_height,对于所有的Views都需要对这两个属性进行设置来指定尺寸。
在这里因为LinearLayout是整个视图的根布局,所以对于宽和高都应该是充满整个屏幕的,通过指定width 和 height属性为"match_parent"
。该值表示子View扩张自己width和height来匹配父控件的width和height。
想要获得更多关于Layout属性的信息,请参照XML布局向导。
添加一个文本输入框
与其它View一样,你需要设置XML里的某些属性来指定EditText的属性值,下边是你应该在线性布局里指定的一些属性元素:
1 在activity_my.xml 文件的 标签内定义一个 标签,并设置id为@+id/edit_message.
2 设置layout_width和layout_height属性为 wrap_content.
3 设置hint属性为一个string 值的引用edit_message.
res/layout/activity_my.xml
<EditText android:id="@+id/edit_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
属性说明:
android:id
这里定义的是View的唯一标示符,你可以在程序的代码里进行引用,你可以对这个类进行读和修改的操作(在下一课里将会用到)
当你想从XML里使用资源类的时候必须使用@符号,紧随@
之后的是资源的类型(这里是id
),然后是资源的名字(这里使用的是edit_message
)。(其他的资源可以使用相同的名字只要他们不是相同的资源类型,例如:字符串资源可以使用相同的名字)。
+号只是当你第一次定义一个资源ID的时候需要。这里是告诉SDK此资源ID需要被创建出来。在应用程序被编译之后,SDK就可以直接使用ID值,edit_message是在项目gen/R.java
文件中创建一个新的标示符,这个标示符就和EditText关联起来了。一旦资源ID被创建了,其他资源如果引用这个ID就不再需要+号了。这里是唯一一个需要+号的属性。
android:layout_width 和android:layout_height
对于宽和高不建议指定具体的大小,使用wrap_content
指定之后,这个视图只是占据内容大小的空间。如果你使用了match_parent
,这时EditText将会布满整个屏幕,因为它将适应父布局的大小。想要看到更多信息,请参考 布局向导。
android:hint
当文本框为空的时候,会默认显示这个字符串。对于字符串@string/edit_message
的值所引用的资源应该是定义在单独的文件里,而不是直接使用字符串。因为使用的是值是存在的资源,所以不需要使用+号。然而,由于你还没有定义字符串的值,所以在添加@string/edit_message
时候会出现编译错误。下边你可以定义字符串资源值来去除这个错误。
Note: 该字符串资源与id使用了相同的名称(edit_message)。然而,对于资源的引用是区分类型的(比如id和字符串),因此,使用相同的名称不会引起冲突。
增加字符串资源
默认情况下,你的Android项目包含一个字符串资源文件,res/values/string.xml
。打开这个文件,为"edit_message"
增加一个供使用的字符串定义,设置值为”Enter a message.”
1 在Android Studio, f从res/values 打开strings.xml.
2 添加一个string名为”edit_message” ,值为 “Enter a message”.
3 再添加一个string名为 “button_send”,值为”Send”.
4 接下来将使用第3步创建的string.
5 删除 “hello world” string.
下边就是定义好的res/values/strings.xml
文件内容:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My First App</string>
<string name="edit_message">Enter a message</string>
<string name="button_send">Send</string>
<string name="action_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
</resources>
当你在用户界面定义一个文本的时候,你应该把每一个文本字符串列入资源文件。对于所有字符串值,字符串资源能够单独的修改,在资源文件里你可以很容易的找到并且做出相应的修改。通过选择定义每个字符串,还允许您对不同语言本地化应用程序。
要想获得跟多的对于不同语言本字符串资源本地化的问题,请参考兼容不同的设备(Supporting Different Devices) 。
添加一个按钮
1 在 Android Studio里, 编辑 res/layout下的 activity_my.xml 文件.
2 在LinearLayout 内部, 定义一个Button>标签紧接着 EditText标签.
3 设置Button的width 和 height 属性值为 “wrap_content” 以便让Button大小能完整显示其上的文本.
4 定义button的文本使用android:text 属性,设置其值为前边定义好的 button_send 字符串.
此时的 LinearLayout 看起来应该是这样
res/layout/activity_my.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<EditText android:id="@+id/edit_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send" />
</LinearLayout>
Note 宽和高被设置为"wrap_content"
,这时按钮占据的大小就是按钮里文本的大小。这个按钮不需要指定android:id的属性,因为在Activity代码里不被引用到。
当前EditText和Button部件只是适应了他们各自内容的大小,如下图所示:
这样设置对按钮来说很合适,但是对于文本框来说就不太好了,因为用户可能输入更长的文本内容。因此如果能够占满整个屏幕宽度会更好。LinearLayout使用权重的属性来达到这个目的,你可以使用android:layout_weight属性来设置。
你可以根据每一个部件所占的空间来指定权重值的大小,它的总数是有同级别的部件来决定的。就类似于饮料的成分配方:“两份伏特加酒,一份咖啡利口酒”,意思就是这个酒中伏特加酒占三分之二。例如,你设置一个View的权重是2,另一个View的权重是1,那么总数就是3,这时第一个View占据2/3的空间,第二个占据1/3的空间。如果你再加入第三个View,权重设为1,那么第一个View(权重为2的)会占据1/2的空间,剩余的另外两个View各占1/4。(请注意,使用权重的前提一般是给View的宽或者高的大小设置为0dp,然后系统根据上面的权重规则来计算View应该占据的空间。但是很多情况下,如果给View设置了match_parent的属性,那么上面计算权重时则不是通常的正比,而是反比,也就是权重值大的反而占据空间小)。
对于所有的View默认的权重是0,如果你只设置了一个View的权重大于0,那么这个View将占据除去别的View本身占据的空间的所有剩余空间。因此这里设置EditText的权重为1,使其能够占据除了按钮之外的所有空间。
让输入框充满整个屏幕的宽度
为让 EditText充满剩余空间,做如下操作:
1 在activity_my.xml文件里,设置EditText的layout_weight属性值为1 .
2 同时设置EditText的layout_width值为0dp.
res/layout/activity_my.xml
<EditText
android:layout_weight="1"
android:layout_width="0dp"
... />
为了提升布局的效率,在设置权重的时候,你应该把EditText的宽度设置为0dp。如果你设置为”wrap_content”作为宽度,系统需要自己去计算这个部件所占有的宽度,而此时的因为你设置了权重,所以系统自动会占据剩余空间,EditText的宽度最终成了不起作用的属性。
下图展示了设置权重后的的效果
现在看一下完整的布局文件内容:
res/layout/activity_my.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<EditText android:id="@+id/edit_message"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send" />
</LinearLayout>
运行应用
整个布局默认被应用于创建项目的时候SDK工具自动生成的Activity,运行看下效果:
- 在Android Studio里,点击工具栏里的Run按钮
- 或者使用命令行,进入你项目的根目录直接执行
转载请注明来源:欢迎开始Android应用开发之旅!