第三章:使用 Android Studio 编程

优质
小牛编辑
132浏览
2023-12-01

本章包含如何在Android Studio中书写或生成代码。 Android Studio 使用面向对象编程的思想来生成极其相关的和格式规范的代码。本章的特色体现在重载方法,Java块的包围语句,使用模板插入代码,自动补全,注释代码和移动代码,如果你读这本书的目标是要精通Android Studio,那么你需要密切关注这章,因为所描述的工具和技术将在你的编程效率发挥最大的作用。 让我们开始吧,若是在第一章创建的 HelloWorld 应用程序还没有打开,请前往打开。

代码折叠是一种在编辑器中保存屏幕实际使用空间的方式,代码折叠允许你去隐藏特定代码块以便于于你可以充分地集中注意力在你感兴趣的代码块上,如果MainActivity.java 没有打开,按Ctrl+N | Cmd+O 并输入Main,按Enter键打开MainActivity.java 的类,如图3-1

图3-1 使用输入类名对话框来打开MainActivity.java

如果行号默认没有显示,导航到Help ➤ Find,输入show line numbers并且勾选Show Line Numbers Active Editor这一项,如图3-2.

图3-2 使用输入Action或者选项名对话框来显示行号

正如你在MainActivity.java中所观察到的行号,你将会注意到一些奇怪的情况:行号不是连续的,在图3-3中,行号从1,2,3开始,然后就跳跃到7,8,9了,仔细观察图3-3的第3行,你会发现这里在import语句的左边有一个包含了+的方块,同时随后是省略号,如果你仔细观察你的代码,你也会注意到这个省略号用浅绿色高亮显示,这些可见的元素提示你Android Studio 正隐藏被折叠的代码块

图3-3. 在import 语句的折叠代码块

位于左边留空处是折叠边框形成的细虚线,同时介于灰色留空与白色编辑器之间,折叠边框包含了三个图标:位于小方块的内部+号(正如图3-3的第3行)和有着水平线在里面的上下箭头,向下的将头表名是一个可折叠代码块的开始部分,同时向上箭头指示它的结束部分,上文提到的+号,表明某个代码块已经被折叠了,点击这些图标中的任意一个将会切换对应代码块为折叠还是打开状态,表3-1包含了代码折叠操作的描述和快捷键。

把你的光标放在 MainActivity.javaonCreate() 方法中,现在长按Ctrl+Period | Cmd+Period来切换他的代码块展开或折叠,此外,也可以用快捷键Ctrl+数字键"+"或者Cmd+数字键"+"展开代码、也可以用快捷键Ctrl+数字键"-"或者Cmd+数字键"-"折叠代码。

总之通过点击在折叠边框内的代码折叠图标折叠/展开你的代码块,记住,折叠单个块,多个块,或一个文件的所有块,是为了节省屏幕空间从你的视线中删除了,然而当你bulid的时候,编译器仍然会编译他们。类似的,折叠一个包含了问题的、有错误的代码的块将不会从标示条删除任何警告或者出错。你若要改变代码折叠的选项,请选择通过菜单选线进入Settings ➤ Editor ➤ Code Folding.

使用代码补全

现代大多数编译器都会提供一些代码补全的格式,Android Studio也不例外,Android Studio乐意帮助,就算你不主动去寻求帮助,实际上,Android Studio将为你各种各样的的默认提醒来随着你的输入完成你的代码。这些Android Studio自动生成的默认提醒列表可能是不完美的,但是这些提醒是根据最佳实践得到来设置的,并且它们通常遵循很好的命名规则。Android Studio可以很好地理解Android SDK和java程序设计语言;事实上,它可能知道那些问题,远远超过你所知道的,如果你以谨慎和热忱的心态学习这个工具的使用,你最终将会看起来想一个摇滚歌手,不管你的之前的编程经验是什么。 这个代码补全的特点是对上下文敏感的,在此条件下,这些补全根据你的光标所在的范围来提供给你不同的提醒,比如,你正在键入一个类范围内的代码,代码补全的提醒将是不同于你在方法范围内键入的代码,即使你选择不接受这个代码补全提醒,基于上述理由,你也需要注意他们。

表3-2列出了4种在Android Studio中的代码补全:

  • 一旦你键入代码,默认的代码补全功能会自动启作用
  • 基本的代码补全不仅扮演着类似于默认代码补全的功能,还在提醒列表中的当前选项的旁边展示了一个Javadoc的窗口
  • 精妙的代码补全同时扮演者Javadoc的功能之外,还有生成一个更敏感的相关的提醒列表
  • 循环地扩展单词环,允许你选择在已用过的源代码单词

让我们开始编码来演示代码补全是怎么工作的,在包com.apress.gerber.helloworld右键(Mac中是Ctrl-单击),并选择 New ➤ Java Class 来创建新的类对话框,如图3-4所示,吧这个类命名 Sandbox 并点击OK

创建新的类对话框

Sandox.java的Sandbox 类的大括号内部,定义一个私有变量,如图3-5,一个代码补全的菜单出现了,并列出了可能的选择帮你完成你的嗲吗,使用上下箭头键来导航代码补全的菜单,使用下键选择List<E>这个选项并回车。

图3-5. 当你开始输入的时候出现的一个代码补全的菜单

Android Studio的默认行为是当你开始键入时,出现代码补全提醒列表,你不需要激活任何快捷键来调用这个默认的代码补全——他是自动出现的。你应该现在有一行私有 List的代码,如图3-6,直接跟随这个单词列表,键入左尖括号用以定义在java中的泛型,注意Android Studio关闭了括号语句用封闭的右尖括号,并把你的光标置于括号中

图3-6. 字符串作为泛型的列表的代码补全

在尖括号的Str类型,按下Ctrl+Space调用基本代码补全功能。你将会注意到一个String的Javadoc窗口的文档在提醒列表中出现当前选中项(String) ,滚动 Javadoc 窗口可以看到对String的Javadoc文档说明,点击向上箭头,Javadoc窗口将展示出详细的String API文档在你的默认浏览器,返回 Android Studio 并选择String作为泛型类,你将会使用的,按Enter 键定义出List<String>

Android Studio的特色之一是它会为你提醒变量名,直接键入一个空格后,私有 List<String>通过按Ctr+空格出现基本的基本代码补全,Android Studio生成一个提示列表,但是上述变量名都不足于描述,因此只能键入mGreetings。小写字母m 代表成员(即域),把类的成员名用m作为前缀在Android中是一种命名约定。同样的,静态类成员用小写字母s作为前缀,你不需要遵循这种命名约定,但是你的代码会更容易被别人阅读如果你遵循了,记住局部变量(方法作用域内)不允许用ms作为前缀约定,修改你的代码行为List<String> mGreetings = new。按 Ctrl+Shift+Space调用智能代码补全,选择ArrayList<>()完成语句,还包含了终止的分号,如图3-7,类似于基本代码补全,在生成提醒列表的时候,还比默认的和基本代码补全范围增多了,比如,当使用智能代码补全在赋值操作的右边,提醒列表通常包含了相关的工厂方法。

注:如果你的在 Android Studio 的JDK版本是7或者更高,通过代码补全的生成的代码可能是用菱形标记,比如,在使用泛型的赋值语句来定义的右边,ArrayList<String> 可能出现为ArrayList<>

图3-7 智能代码补全

循环扩展词是一个花哨的名字,但是它实际上非常简单。调用循环扩展词只需按下Alt键,同时按住/键几秒钟,单词集合里提供你同样的单词,他们都曾出现在你的文档里,由于你的循环遍历这些单词,注意黄色高亮部分,现在调用循环扩展词,长按Alt + Shift +"/",注意到提供并高亮的单词现在向下远离你的光标,而非向上远离。

注释代码

如果你已经完成了所有的编码工作,你了解到,有些代码行是一些注释,将会被编译器忽略,但是包含了信息或者元数据,数据是非常重要的,对于编码者和协同编码者,注释可能是行注释,以//开始,也可能是块注释,以/开始,以/结束,从主菜单可以看出,你可以激活注释,只需选择Code ➤ Comment,然而,最好的方法是通过快捷键来截获,如表3-3所示:

类型重构初始化被构造,并放在mGreetings 声明的上面,Ctrl+/ | Cmd+/把其转化为注释,如图3-7,在开启和关闭注释切换实验,只需使用快捷键Ctrl+/ | Cmd+/.

使用代码生成

恰当的使用代码生成功能,这一特色将为你节约大量的时间,代码生成是生成各种方法的的强大功能,包括了构造,getters, setters, equals()hashCode(), toString(),方法等等。在你使用代码生成之前,确认Android Studio 是配置好了,可以忽略成员名称的前缀,如m和s,点击File ➤ Settings ➤ Code Style ➤ Java ➤ Code Generation将得到设置对话框,将会出现代码生成的标签页,如果域和静态域文本框不包含ms,则键入他们并点击”应用“和”确定“,如图3-8.

图3-8 加入ms到代码生成标签页的域和静态域

构造器

把你的光标放在Sandbox.java的类范围中。为了在Android Studio生成一个构造器,按Alt+Insert | Cmd+N并选择 Constructor,那么选择的域被构造对话框初始化,如图3-9,选择类成员作为参数。我们非参数构造器,因此点击None这个按钮。在Java中,是很常见的,就是重载构造器,通过不同类型的参数和不同数量的参数,比如,你可以调用这个对话框来生成一个带List<String>参数的构造器,并且为成员变量mGreetings赋值。

通过构造对话框来选择要初始化的域。

Getters/Setters

Java类通常是封装好的,这意味着类成员通常声明为私有的,并且访问这些成员的公共接口是通过公有访问器(getter)和公有修改器(setter)方法爱提供的。在Sandbox.java类域范围内点击你的鼠标。并且按Alt+insertCmd + N)。你会注意到有一个选项是Getter,一个为Setter,还有GetterSetter的组合。Gettersetter 方法一般都是成对出现的,除非你有一个很好的理由要省略其中一个或着另一个,否则最好是生成后面的组合选项。从列表中选择Getter and Setter, 如图3-10所示。在随后的选择字段生成gettersetter对话框中,从列表中选择mGreetings:List<String>列表并点击OK。你的类现在为变量mGreeting有了gettersetter,如图3-11。请注意,生成的代码忽略了m前缀,在生成方法名称的时候,因为你在之前的设置中把ms设置为了前缀。

生成访问器和修改器

生成访问器和修改器方法

方法重载

代码生成是理解类继承结构的,所以你可以覆盖包含在任何父类或接口实现的方法。Sandbox.java是一个简单的普通java对象(POJO)。现在你修改Sandbox类来继承RectShape。当你输入继承RectShape时,这个词RectShape可能以红色突出显示。如果适合你需要的情景,按Alt + Enter来导入RectShape类,如图3-12所示

继承超类

如果你通过按Ctrl+H调用了层次结构视图,您将看到带有RectShapeSandbox的类层次结构,Shape,和Object作为它的祖先,可以通过观察图3-13,你可以明白。现在按Alt +Insert | Cmd + N并选择覆盖方法。让我们重写ShapehasAlpha()方法,如图3 - 14所示。自java 5 版本开始的约定:要用@Override来注解想覆盖的方法,我们选中@Override复选框并插入。@Override注解告诉编译器来验证方法的名字和签名,以确保该方法事实上已被覆盖。修改hasAlpha()的返回值为true

在RectShape中选择要覆盖/实现的方法

修改hasAlpha( )方法

toString( )方法

Android Studio 可以为你生成toString()方法。让我们为Sandbox创建一个toString()方法,同时也包括mGreetings成员。按Alt +Insert| Cmd + N并选择toString()。选择你的唯一成员——mGreetings,并单击OK。Android Studio生成一个返回字符串,如“Sandbox{“+”mGreetings = " + mGreetings +‘}’,如图3-15。如果在类中有多个成员,可选择他们,他们也会被附加到这个方法的返回字符串。当然toString()方法生成的代码并不是一成不变的,这个方法是可以改变为任何你想要的,只要它返回是一个字符串。

图3-15 生成toString()方法

委托方法

Android Studio知道你的类成员,从而允许您从一个代理委托行为方法中定义类方法的类成员。这听起来很复杂,但它很容易。为了给你展示委托方法的选择是如何工作的,让我们转到代码中来看。在Sandbox.java,把你的光标放在类范围内。按Alt +Insert | Cmd + N,然后选择 Delegate Methods。选择mGreetings:List<String>并按下OK。列表接口有很多方法,你都可以委托行为。为简单起见,选择添加(object:E):boolean,如图3-16。如果你想委托多个方法,在选择这些方法的时候,按住Ctrl键(Cmd键在Mac),单击OK。

选择要生成委托的方法

Sandbox.java中生成的add()方法现在是一个代理,代表mGreetings成员行为的add()方法。如图3-17所示。注意到add()方法的参数是定义为一个String来匹配mGreetings的泛型定义,List<String>。委托方法并不覆盖方法,所以您可以随意重命名你的代理方法,但这个名字add()很有意义,所以尽可能保留这个名字。

生成 add( )方法

插入动态模板

Android Studio有很多模板,允许您将预定义的代码直接插入到你的源文件中。在许多ide,生成的代码只是从模板中粘贴,而从来不考虑作用域;但是Android Studion的模板是对作用域敏感的,也可以集成变量数据。在你开始使用Android Studion的动态模板之前,让我们探索动态模板和自定义模板。导航到File ➤ Settings ➤ Live Templates。选择普通模板组。现在在右上角单击绿色加号按钮并选择住模板。如图3-18,填充好缩写、描述和模板文本字段。在这个模板可以应用之前,您必须单击Define按钮,这看起来像一个蓝色的超文本链接,位于窗口的底部。现在选择Java和选择所有范围(语句,表达式,声明等等)。单击Apply。

图3-18 创建一个名为cb的动态模板(注释块)

您刚刚创建一个称为cb的自定义动态模板,将在任何Java源文件和任何范围中编码时都是可用的。如图3-18,红色的字$SELECTION$ 是一个变量。很快你会看到这个变量在起作用。动态模板的选项如表3 - 4所示

在离开动态模板的设置页面之前,浏览一下现有的动态模板,简称为psfs,在简单模板组中。单击psfs来查看其内容。你会注意到这个模板最终生成一个公共静态的字符串常量,它仅在Java和Groovy声明范围可用。单击OK返回Editor。在Sandbox的声明部分,在mGreetings的定义下面,键入psfs然后按Ctrl + J | Cmd + J调用动态模板,然后按Enter键。给这个常数一个名称来完成这个声明并赋值,如 public static final String HELLO = “Hello Sandbox”;

注意:在Java中,常量的命名约定是全部大写。在构造函数,输入CONSTRUCTORS这个单词。现在这个词转换成一个注释块好引起其他程序员的注意。选择整个词,CONSTRUCTOR,然后按Ctrl + Alt + J | Cmd + Alt + J弹出动态住模板。从动态模板列表中选择cb和按Enter键,如图3-19。你即可应用在前面创建的动态模板

应用动态模板称为cb(注释块)

Moving Your Code

Android Studio 可以感知代码块结束,所以按行或者代码块移动都是很容易和直观的。移动语句和移动行之间的差别是:移动语句代表着考虑界限和范围,而行不考虑。如果你选择有着Move Statement的代码语句来移动,该语句将保留它的块的边界范围。如果你移动相同的有着Move Line的语句,Android Studio将语句作为一个简单的行文本,并将它移动到任何你想要到的地方。

你也可以移动整个代码块。 有了Move Statement,所有你需要做的是把光标放在你想移动的块的开始行(花括号的),按Ctrl + Shift + Down | Cmd + Shift +Down 或者Ctrl + Shift + Up| Cmd + Shift + Up,在考虑其他的边界块和保持封闭的边界范围内的情况下,整个块将集体移动。Move Line 不能识别范围或界限,但你仍然可以移动多行,通过 Alt + Shift + Up | Alt + Shift +Down(分别在PC和Mac中)实现Move Line Up or Move Line Down 操作。

要理解 Android Studio的移动操作,最好就是实践一下。首先让我们在add()方法中创建一个语句,随后直接返回mGreetings.add(object),按回车键并开始一个新行并键入soutm。然后按Ctrl + J | Cmd + J调用动态模板,会产生System.out.println(“Sandbox. add");。您可能已经注意到,你的新行代码将不会达到,因为返回语句在其上面,如图3-20所示。用Move Statement Up移动这个语句,同时按住Ctrl | CmdShift,多次按向上箭头键。Android Studio 重新放置这个语句,但是不让你把这个语句移到一个可能没有任何意义的范围。再次尝试此操作 Move Line (Alt + Shift +Up),观察其行为。

Move Statement 和 Move Line

让我们尝试一下另一个例子来演示移动Move Statement的强大:把构造函数移动到类的底部。确保Sandbox()声明和上面的注释块之间没有空换行。现在,把你的光标在声明的Sandbox(),并且按住Ctrl | CmdShift键,同时按下箭头键来调用Move Statement Down,重复直到你的构造函数是类的最后一个方法。注意,整个块,包括注释,都移动到类的底部了,避免了其他方法。移动代码操作和键盘快捷键表如3 - 5所示。

样式代码

代码风格规范在不断发展。没有固定的规则,你应该在你的方法之后放置空格的数量,还是左括号应该出现在同一行作为方法签名或略低于它。组织倾向于定义自己的代码风格,但每个程序员的代码风格也各不相同,你也可能有你习惯的代码风格。幸运的是,Android Studio很简单就能样式化和组织你的代码。在开始样式化代码之前,让我们检查一下代码风格的设置。选择File ➤ Settings ➤ Code Style弹出设置对话框,如图3 - 21所示。Java和XML是我们在Android中最感兴趣的语言。在左窗格中切换打开代码风格选项,选择Java,并检查在设置窗口的每个选项卡。

图3-21 代码风格➤Java selected并显示包装和括号选项卡的设置对话框

通过在中间的面板的各种tab页的这些设置选择/取消选择复选框的实验,注意类在右窗格中发生相应变化,满足你的风格。点击Manage按钮在顶部定义一个新的架构。现在点击另存为,给您的架构起一个名字,比如android,并单击OK。如果你做出进一步更改保存方案,单击Apply按钮应用它们。当你用Ctrl + Alt + L | Cmd + Alt + L格式化你的代码,在代码中设置你选择的风格标签将被应用。代码组织的选项如表3 - 6所示。

自动缩进行

自动缩进行有助于保持正常的行缩进代码。在Java中管理标签和缩进规则,通过File ➤ Settings ➤ Code Style ➤ Java ➤ Tabs and Indents。自动缩进线应用于当前行,或如果您有多个行选中,则是选中的所有行。

Sandbox.java,选择整个方法的代码块,按Tab键。块应该向右移动一个选项卡的距离。现在把光标放在第一行的块,按Ctrl + Alt +I(在PC和Mac中)。你会注意到自动缩进复位这条线到适当的缩进位置,尽管方法块的其余部分仍不受影响。现在选择的所有代码的类按Ctrl + I| Cmd +A,并且按Ctrl + Alt +I。这次,适当的缩进将会应用于整个文件。

重新整理代码

Arrangement管理代码中元素的顺序。例如,大多数人喜欢保持在类的顶部声明类成员,其次是构造函数,其次是gettersetter,等等。通过File ➤ Settings ➤ Code Style ➤ Java ➤ Arrangement,您可以编辑Arrangement的安排设置选项卡。在前面的部分中,您将构造函数的类。这不是通常他们在的地方。从主菜单 Code ➤ Rearrange。你会注意到构造函数已经搬回其预期的位置——声明部分的下面。Rearrange Code按照 Arrangement 的设置执行这种重排操作。

代码重新格式化

重新格式化代码是在代码样式化中最强大的功能,因为它给了你选择应用的所有代码风格选项中定义的代码风格设置。正如您已经看到的,代码风格设置可以通过从主菜单中访问——File ➤ Settings ➤ Code Style。此外,重新格式化代码允许您重新格式化当前选择的文件,或相同类型的每个文件和目录。此外,重新格式化代码允许您链接重新排列条目(这将重新排列代码的Java文件),并优化导入到命令,如图3-22。按Ctrl + Alt + L | cmd + Alt + L,尝试重新格式化Sandbox.java

图3-2 包含重新整理条目选择的重新格式化代码对话框

环绕

环绕(Ctrl + Alt + T | Cmd + Alt + T)是一个在周围发现功能的超集,环绕动态模板(Ctrl + Alt + J | Cmd + Alt + J)。然而,环绕还包括选项来选择与Java语句或语句块周围如if / else,try / catch等等。虽然在你的Sandbox类中,简单的代码不可能产生任何受控异常,周围的语句可能抛出异常的try / catch块的周围是最好的应用,这可能是为什么键盘快捷键Ctrl + Alt + T | Cmd + Alt + T包括一个T。环绕的操作如表3 - 7所示。

Sandbox.javaadd()方法中,您希望确保没有重复的。让我们用一个if / else块围绕 return mGreetings.add(Object); 如图3-23。选择整行,按Ctrl + Alt + T | Cmd + Alt + T激活周围。现在从菜单中选择if / else。在if的括号里键入!mGreetings. contains(object),在else块返回false;

图3-23 用Surround With包装和打开代码块

假如你的业务规则已经改变,你不再关心mGreetings重复的条目了。使用Unwrap/Remove删除刚才创建的if / else块。把你的光标在return mGreetings.add(object);语句的任何位置,按Ctrl + Shift +Delete| Cmd + Shift +Delete,并选择打开。该方法现在看起来应该像之前你修改它的那样。 环绕的另一个伟大的应用是遍历集合。在前面的小节中自动生成toString()方法。现在改变这种方法遍历mGreetings集合。删除toString()方法的返回语句,确保toString()方法的主体是空的。现在键入mGreetings,然后按Ctrl + Alt + T | Cmd + Alt + T。从列表中选择迭代Iterable,或者按I键。再次按下Enter接受greeting作为单个元素的名称。生成的代码是一个for - each循环。注意到Android Studio明白mGreetings包含字符串,而且它也产生一个局部变量叫做greeting ——mGreetings缺少 m的单数形式。进一步修改add()方法,如图3-24。

小结

本章涵盖了Android Studio最重要的代码生成功能。我们鼓励您返回File ➤ Settings ➤ Code Style ➤ Java and File ➤ Settings ➤ Code Style ➤,并花几分钟探索各种设置。Android Studio为编码提供了很多快捷键,但你不必记得。如果你会不知所措,你可以使用本书作为参考,或者导航到Code菜单和探索其菜单项和子菜单作为参考。

勘误感谢:Sohnyi ,zhin