Android编写程序界面(控件+布局+大量实例)


96 
叶琛_ 
2016.10.02 11:45*  字数 2614  阅读 11559 评论 15

文/叶琛

作为软件开发者,如果希望自己的软件受到用户喜欢和广泛使用,就应该意识到界面设计和功能开发同样重要。

从实际经验来看,一个优秀的软件,首先得满足对用户友好的操作界面。界面美观的应用程序可以增大用户粘性,同时吸引更多新用户。

阅读我的前一篇文章《Android开发(一)|第一个Android项目》,相信读者对于创建安卓项目已不是问题,接下来要做的第二件事就是在空白活动的基础上编写程序界面。

Android为我们提供了大量UI开发工具,合理使用它们,就可以编写出各式各样的漂亮界面。

例如简单的机票查询界面:

机票信息查询

创建好一个MainActivity活动,项目命名为AllTest(可随意),然后我们来实际开发一个简单美观的程序界面。


1、 如何编写程序界面

Eclipse(本文选用)和Android Stdio都有可视化界面编辑工具,可以直接拖拽控件并在视图中修改属性。不过初学时并不推荐这种方法。而且这种方式作出的界面屏幕适配性一般较差。

我们采用最基本的方式实现:编写XML代码。每当新建一个活动,ADT会自动帮你生成一个.XML文件,我们可以按需要修改增添。

.XML位置

2、 常见控件使用方法

借助大量的UI控件和合理的排版规划,我们可以非常轻松的编写出想要的界面效果。

可以通过一张图片了解Android控件的继承关系:

所有控件继承自android.View

1) TextView

TextView是Android最简单的控件。它主要用于在界面上显示一段文本信息(但不允许用户修改内容)。

我们将activity_main.xml中的代码修改如下:

定义TextView

android:id即给控件定义一个id,之后通过这个id就能定位到该控件。

Android中所有控件都有这两个属性:android:layout_width|android:layout_height,指定了控件的宽度和高度。可选值为match_parent/wrap_content,前者表示让当前控件大小和父布局一致;后者表示由控件内容决定当前控件大小(即刚好包含里面的内容)。

android:text表示文本框显示的内容。TextView还有很多属性可以设置,例如颜色(android:textColor 以十六进制表示)、文字对齐方式(android:gravity)等等。各控件的属性不用特意记,需要时查阅文档即可。

关于布局,我们这里采用LinearLayout线性布局方式,待会再细说。

AllTest右键→Run as→Android Application启动模拟机,得到如图界面:

TextView效果

2) Button

Button是程序和用户交互的一个重要控件。它可配置的属性基本和TextView相同。

我们可以在activity_main.xml中这样加入Button:

定义Button

更新Android Application,得到如下效果:

Button效果

为什么按钮占据整行了呢?因为它的属性android:layout_width被我们设置为match_parent,和父布局LinearLayout的一样。

在主活动中为按钮注册一个监听器,当点击按钮将执行onClick()方法,完成我们需要的操作。具体实现过程将在本系列第四篇文章中,和活动数据的传递一起讲述。现在我们先纯粹显示一个按钮。

3) EditText

EditText是程序与用户进行交互的另一重要控件,它允许用户在控件中输入和编辑内容,并且可以在程序中对这些内容进行处理。

我们发微博、聊QQ,都将使用到它。现在在界面中加入EditText,继续修改activity_main.xml中的代码:

定义EditText

android:hint属性指定了一段提示性文本。android:maxLines指定EditText最大行数为两行,当输入的内容超过两行,文本会向上滚动,EditText不再拉伸。

得到如下效果:

EditText效果

到这儿我们能总结出Android控件的使用规律了:基本上用法大同小异,给控件定义一个id,再指定宽度、高度,然后加些控件特有的属性就可以了。使用XML来编写界面一点都不难。

4)ImageView

ImageView是用于在界面上展示一张图片的控件,它能让我们的程序界面变得更加丰富多彩。

drawable文件夹下已自动生成一张ic_launcher.png图片,我们先在界面上展示它。修改activity_main.xml中的代码:

定义ImageView

这里使用android:src属性给ImageView指定了一张图片(格式不限),因为图片宽高均设为wrap_content,所以无论图片多大都能完整展示出来。重新运行程序:

ImageView效果

5)ListView

ListView绝对算Android最常用控件之一,它允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据会滚动出屏幕。

回忆一下,我们每天都在使用这个控件。例如翻阅微博、查看手机联系人等等。

不过比起前面几种控件,ListView用法相对复杂很多。笔者将会在本系列第三篇文章中单独对ListView进行详细讲解。


除了上面提到的常见控件,还有ProgressBar(进度条)、AlertDialog(弹出式对话框)、AnalogClock(时钟)等等,今后在不断学习过程中会接触更多的控件。

当系统控件不够用时,我们还可以自定义控件以达到目的。限于篇幅这儿先不演示啦。

3、 四种基本布局

一个丰富的界面常要有很多个控件组成,如何才能让各个控件都有条不紊地摆放在界面上?这就需要借助布局。

布局是一种可用于放置很多控件的容器,它能按一定规律调整内部控件的位置,从而编写出精美界面。

Android中一共有四种基本布局,我们来逐一了解:

(1) LinearLayout线性布局

这个布局会将它所包含的控件在线性方向上依次排列。android:orientation属性指定了排列方向,之前展示控件时就采用了这种布局的“vertical”垂直方向,所有控件排成了一列。

LinearLayout布局

如果指定的是“horizontal”,控件就会在水平方向上排列。

水平排列布局

(2) RelativeLayout相对布局

这是另一常用布局,相比LinearLayout显得更加随意。它可以通过相对定位的方式让控件出现在布局的任何位置。

RelativeLayout属性比较多,但都有规律可循,并不难理解记忆。

我们继续通过实例体会,修改activity_main.xml中的代码:

RelativeLayout布局

类似android:layout_alignParentLeft的属性可能之前没接触过,可它的名字已经完全说明了它的作用——控件相对于父布局左对齐。重新运行程序:

RelativeLayout效果

上例控件都是相对于父布局进行定位的,还可以相对于控件进行定位,只要改变相应属性,具体可参见下表,不再赘述。

RelativeLayout的部分属性

(3) FrameLayout

相对于前两种布局,FrameLayout可简单多了。因为它没有任何定位方式,所有的控

件都会摆放在布局的左上角。因此应用场景也少了很多。很简单吧!这里我们不再演示。

(4) TableLayout

TableLayout允许我们使用表格的方式来排列控件。

表格自然会有行和列。设计表格时我们尽量让每一行拥有相同列数,这样的表格是最简单的。当表格的某行一定要有不相等列数时,可以通过合并单元格的方式处理。

通过一个登录界面的实例化来使用这个布局。可以这样修改activity_main.xml中的代码:

TableLayout布局
TableLayout布局(接上)


在TableLayout中每加入一个TableRow,表示在表格中添加一行;在TableRowt每加入一个控件,就表示在该行中加入一列。

在TableLayout中我们无法指定控件宽度,但是可以通过android:stretchColumns属性解决。它允许将TableLayout中的某一列拉伸,以达到自适应屏幕宽度的作用。

android:stretchColumns属性

将其值指定为1,如果表格不能完全占满屏宽,就拉伸第二列。没错!“1”就是拉伸第二列,“0”就是拉伸第一列。

运行这个程序:

TableLayout布局效果

而关于点击按钮的消息响应以及用户名、密码的数据存储这里暂不讲解,重点示范TableLayout布局的使用。


布局还可以嵌套布局,以形成层次分明、功能健全的精美界面。activity_main.xml的代码并不复杂:

LinearLayout布局嵌套

回头看之前的机票界面,就是通过LinearLayout布局嵌套加上简单、常用控件完成的:

简单的机票信息界面

现在的你,完全可以做到这样的效果甚至比它更精美。

如果你新编出一个精美的界面,欢迎留言或私信共享。如果编程中出现解决不了的困惑,我会尽最大努力帮助你解答。

最后一个tip:当我们开发一个项目时,强烈建议把其它不相关的project暂时全部关闭,避免修改代码时改错地方:)

BTW:接下来还会带来一系列的安卓开发教程文章,您的支持是我最大的持久力!


作者:叶琛

一个痴迷旅行的 IT程序狗

猜你喜欢

转载自blog.csdn.net/weixin_42407278/article/details/80724595