英语原文共 62 页,剩余内容已隐藏,支付完成后下载完整资料
第三章 设计用户界面
在第17页的快速入门第1章中,我们使用Android Eclipse插件在几分钟内制作了一个简单的“Hello,Android”程序。在第二部分中,我们将创建一个更具体的例子:一个数独游戏。 通过逐渐添加功能到游戏中,您将了解Android编程的许多方面。我们将从用户界面开始。
你可以在http://pragprog.com/titles/eband3找到本书使用的所有示例代码。 如果您正在阅读本书的PDF版本,则可以在代码清单前单击小灰色矩形以直接下载该文件
3.1介绍数独示例
数独为Android提供了一个很好的示例程序,因为游戏本身非常简单。你有一个八十一瓦的网格(九个横跨和九个下降),并且您尝试用数字填充它们,以便每列,每一行以及三个三个方框中的每一个仅包含数字1到9 一次。当游戏开始时,一些数字(游戏杆)已经被填入。所有玩家必须做的就是提供其余的东西。真正的数独谜题只有一个独特的解决方案。
数独游戏通常用铅笔和纸片玩,但电脑版本也很流行。使用纸质版本,很容易在早期发生错误,当发生这种情况时,必须返回并删除大部分工作。在Android版本中,您可以随时更换方块,而无需刷掉所有烦人的橡皮屑。
数独细则
大多数人认为数独是某种古代日本游戏,但事实并非如此。尽管类似的谜题可以追溯到19世纪的法国杂志,但大多数专家都将现代Sudoku的发明归功于退休的美国建筑师霍华德加斯(Howard Garns),在戴尔杂志首次于美国发行。
Android Sudoku(参见下一页的图3.1)也将提供一些提示,让您从一些烦人的作品的拼图解决中解脱出来。极端地说,它可能只是为你解决难题,但这不会有什么乐趣,是吗?所以,我们必须平衡挑战,不要太简单。
3.2通过声明进行设计
用户界面可以使用以下两种方法之一来设计:过程式和声明式。程序仅仅意味着代码。例如,当您编写Swing应用程序时,您编写Java代码来创建和操作所有用户界面对象,如JFrame和JButton。因此,Swing是程序性的。
另一方面,声明式设计不涉及任何代码。当你设计一个简单的网页时,你使用HTML,这是一种类似于XML的标记语言,它描述了你想在页面上看到的内容,而不是你想如何去做。 HTML是声明式的。
Android试图通过可以让任何一种风格创建用户界面来实现跨越程序性和声明性世界之间的差距。您几乎可以完全停留在Java代码中,或者几乎可以完全停留在XML描述符中。如果您查看任何Android用户界面组件的文档,您将看到Java API和相应的声明式XML属性,它们执行相同的操作。
你应该使用哪一个?无论哪种方式都是有效的,但Google的建议是尽可能使用声明式XML。 XML代码通常比对应的Java代码更短且更容易理解,并且在未来版本中更改的可能性更小。
现在让我们看看我们如何使用这些信息来创建数独开幕画面。
3.3创建开始画面
我们将从Eclipse插件创建的一个框架Android程序开始。正如您在第23页上的第1.2节“创建您的第一个程序”中所做的那样,创建一个新的“Hello Android”项目,但是这次使用以下值:
当然,在一个真正的程序中,你会在这里使用你自己的名字。 包名称尤为重要。 系统中的每个应用程序必须具有唯一的软件包名称。一旦你选择了一个包名称,改变它有点棘手,因为它在很多地方使用。
我喜欢随时保持Android模拟器窗口并在每次更改后运行程序,因为它只需要几秒钟。如果你这样做,现在运行程序,你会看到一个空白的屏幕,只是包含单词“Hello World, Sudoku”。业务的第一步是将其改为游戏的开始画面,使用按钮让玩家开始一个新游戏,继续前一个游戏,获取关于游戏的信息并退出。那么,我们必须改变做什么呢?
正如第2章关键概念第30页所讨论的,Android应用程序是一组松散的活动集合,每个活动都定义一个用户界面屏幕。 当您创建Sudoku项目时,Android插件会在Sudoku.java中为您制作单个活动:
Android调用您的活动的onCreate()方法来初始化它。对setContentView()的调用通过Android视图窗口部件填充活动屏幕的内容。
我们可以使用几行Java代码,并可能使用另外一两个类来定义用户界面。但是,插件选择了声明式路线,我们将继续沿着这些路线前进。在前面的代码中,R.layout.main是一个资源标识符,它指向res / layout目录中的main.xml文件(请参阅下一页的图3.2)。 main.xml用XML声明用户界面,所以这是我们需要修改的文件。在运行时,Android解析并实例化在那里定义的资源,并将其设置为当前活动的视图。
需要注意的是,R类是由Android Eclipse插件自动管理的。当你把一个文件放在res目录的任何地方时,插件会注意到这个改变,并在你的gen目录下的R.java中添加资源ID。如果您删除或更改资源文件,R.java将保持同步。如果你在编辑器中调出文件,它看起来像这样:
十六进制数字只是Android资源管理器用于加载真实数据,字符串以及其他资产被编译到包中。您不必担心它们的值。请记住,它们是引用数据的句柄,而不是包含数据的对象。这些物体在需要之前不会膨胀。 请注意,几乎每个Android程序,包括基本的Android框架本身,都有一个R类。 有关可以使用的所有内置资源,请参阅android.R的联机文档。
所以,现在我们知道我们必须修改main.xml。让我们剖析原始定义,看看我们必须改变。在Eclipse中双击main.xml打开它。根据您设置Eclipse的方式,您可能会看到可视布局编辑器或XML编辑器。在当前版本的ADT中,可视化布局编辑器并不实用,因此单击main.xml或底部的Source选项卡查看XML。main.xml的第一行如下:
lt;?xml version='1.0' encoding='utf-8'?gt;
所有的Android XML文件都以这一行开头。它只是以UTF-8编码告诉编译器该文件是XML格式。UTF-8几乎与普通的ASCII文本完全一样,只是它具有用于非ASCII字符(如日语字形)的转义码。
为什么Android使用XML? 这不是没有效率吗?
Android针对内存和有限的移动设备进行了优化,因此您可能会发现非常普遍地使用XML是很奇怪的。毕竟,XML是一种冗长的,人类可读的格式,因其简洁或效率而不为人知,对吗?
虽然在编写程序时看到XML,但Eclipse插件调用Android资源编译器aapt将XML预处理为压缩二进制格式。这是存储在设备上的格式,而不是原始的XML文本。
接下来我们看到对lt;LinearLayoutgt;的引用:
布局是一个或多个子对象的容器,以及将它们放置在父对象的矩形内的屏幕上的行为。这里是Android提供的最常见布局的列表:
bull;FrameLayout:排列其子项,使它们全部从屏幕左上角开始。这用于选项卡式视图和图像切换器。
bull;LinearLayout:将其子项排列在单个列或行中。这是您将使用的最常见的布局。
bull;RelativeLayout:相对于彼此或与父母相关地安排其子女。 这通常用于表单。
bull;TableLayout:将它的子项排列在行和列中,类似于HTML表格。
一些参数对所有布局都是通用的:
xmlns:android='http://schemas.android.com/apk/res/android'
Defines the XML namespace for Android. You should define this once, on the first XML tag in the file.
android:layout_width='fill_parent', android:layout_height='fill_parent'
Takes up the entire width and height of the parent (in this case, the window). Possible values are fill_parent and wrap_content.
Inside the tag yoursquo;ll find one child widget:
lt;TextView
android:layout_width='fill_parent'
android:layout_height='wrap_content'
android:text='@string/hello' /gt;
这定义了一个简单的文本标签。我们用一些不同的文本和几个按钮替换它。这是我们的第一次尝试。
如果您在编辑器中看到关于缺少语法约束(DTD或XML模式)的警告,请忽略它们。 我们使用@ string / resid语法来引用res / values / strings.xml文件中的字符串,而不是将英文文本硬编码到布局文件中。根据区域设置或其他参数(如屏幕分辨率和方向),您可以拥有不同版本的此资源文件和其他资源文件。
现在打开该文件,根据需要切换到底部的strings.xml选项卡,然后输入:
保存strings.xml以便Eclipse重建项目。 现在运行程序时,应该看到如图3.3所示的内容。
注意:因为这是本书的第三版,所以我在大多数人遇到麻烦时有一个很好的主意。 就在这里:你做了很多改变,所以如果你得到一个错误信息而不是开幕式,不要感到惊讶。不要惊慌; 请直接跳至第69页的第3.10节“调试”,获取有关如何诊断问题的建议。通常在LogCat视图中找到问题的线索。有时选择Projectgt; Clean会解决问题。如果你仍然陷入困境,放在本书的网络论坛上,有人会乐意在那里帮助你。
当前屏幕是可读的,但它可以使用一些外观更改。让我们将标题文字放大并居中,使按钮变小,并使用不同的背景颜色。 这是您应该放入的颜色定义res/values/colors.xml:
这里是新的布局:
什么是Dips和Sps?
历史上,程序员总是以像素为单位设计计算机接口。例如,您可以制作一个宽度为300像素的字段,允许列间距为5像素,并定义尺寸为16times;16像素的图标。问题是,如果您在新显示屏上以每英寸点数(dpi)越来越多的方式运行该程序,则用户界面显得越来越小。在某些时候,阅读变得太难了。
与分辨率无关的测量有助于解决此问题。
Android支持以下所有单元:
bull;像素(像素):屏幕上的点。
bull;英寸(英寸):由尺子测量的尺寸。
bull;毫米(毫米):由尺子测量的尺寸。
bull;磅(分):1/72英寸。
bull;dp(密度独立像素):基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
bull;dip:dp的同义词,在Google示例中更经常使用。
bull;sp(与刻度无关的像素):与dp类似,但也可以根据用户的字体大小偏好进行缩放。为了使您的界面可以扩展到任何当前和未来的显示类型,我建议您始终使用sp单位来显示文字大小和倾角单位的一切。您还应该考虑使用矢量图形而不是位图(请参阅第4章第74页,探索2D图形)
在这个版本中,我们引入了一个新的语法,@ id / resid。而不是引用其他地方定义的资源ID,这是您如何创建其他人可以引用的新资源ID。例如,@ id / about_button定义了About按钮的ID,稍后我们将使用它来在用户按下该按钮时发生某些事情。
结果显示在第53页的图3.4中。这个新屏幕在纵向模式(当屏幕高于宽度时)看起来不错,但是横向模式(宽屏幕)又如何?用户可以随时切换模式,例如通过翻转键盘或翻转手机,所以您需要处理该模式。
3.4使用备用资源
作为测试,尝试将仿真器切换到横向模式(Ctrl F11或键盘上的7或9键)。哎呀! 退出按钮在屏幕底部运行(参见图3.5)。 我们如何解决这个问题?
您可以尝试调整布局,使其适用于所有方向。不幸的是,这往往是不可能的,或导致奇怪的屏幕。发生这种情况时,您需要为横向模式创建不同的布局。这是我们要采取的方法:
创建一个名为res / layout-land / main.xml(注意-land后缀)的文件,其中包含以下布局:
这使用TableLayout来创建两列按钮。现在再次运行程序(参见图3.6)。即使在横向模式下,所有按钮都可见。
您可以使用资源后缀来指定任何资源的备用版本,而不仅仅是布局。例如,您可以使用它们提供不同语言的本地化文本字符串。 Android的屏幕密度支持在很大程度上取决于这些资源后缀(请参阅第13.5节“所有屏幕大小”)。
3.5实施关于Box
当用户选择关于按钮时,意味着他们可以触摸它(如果他们有触摸屏),或者他们用D-pad(方向键盘)或轨迹球导航到它并按下选择按钮,我们想要弹出一个有关Sudoku的一些信息的窗口。
滚动文本后,用户可以按下“后退”按钮关闭窗口
全文共10033字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[10316],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。