这节课是 Android 开发(入门)课程 的第一部分《布局和交互》的第四节课,导师依然是 Katherine Kuan 和 Kunal Chawla,主要内容是嵌套 ViewGroups 和字符串变量。

关键词:嵌套 ViewGroups,字符串变量 String,转义字符

嵌套 ViewGroups (Nested ViewGroups)

课程 2B 通过嵌套 ViewGroups 来升级 Just Java App 的布局,这有两个好处:

  1. 更快捷第从头到尾浏览界面,提升用户体验;
  2. 使内容充满屏幕,而不是一长条。

RelativeLayout 或 LinearLayout 的嵌套使用能够使布局丰富多样,但要注意嵌套 ViewGroups 对设备性能的消耗。另外,FrameLayout 和 GridLayout 这两种 ViewGroups 也能够嵌套。

使用嵌套 ViewGroups 的步骤:分解 Views→画 Views 层级图→写 XML 草稿→代码实现。

  1. 分解Views。下图为课程 2B 应用要实现的布局。

布局中一共有四个 TextView 和三个 Button。这些 Views 总体垂直排列,通过 vertical 的 LinearLayout 能实现;除了第二行有三个水平摆放的 Views,通过 horizontal 的 LinearLayout 能实现。

  1. 画 Views 层级图。通常为树状图,表示 Views 间的父子或兄弟关系,如下图所示。
  1. 写 XML 草稿。根据树状图写 XML 代码的草稿,可以清晰条理,减轻真正用代码实现时的负担。以下是一段 XML 草稿。
<LinearLayout…><TextView.../><LinearLayout…><Button.../><TextView.../><Button.../></LinearLayout><TextView.../><TextView.../><Button.../>
</LinearLayout>
复制代码

注意自闭标签和单独标签的使用,他们用来区分 Views 间的嵌套关系。

  1. 代码实现。以下是在 Android Studio 中实现布局的代码。
<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="vertical"android:paddingBottom="16dp"android:paddingLeft="16dp"android:paddingRight="16dp"android:paddingTop="16dp"tools:context="com.example.android.justjava.MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="16dp"android:text="quantity"android:textAllCaps="true" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:layout_width="48dp"android:layout_height="48dp"android:onClick="decrement"android:text="-" /><TextViewandroid:id="@+id/quantity_text_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingLeft="8dp"android:paddingRight="8dp"android:text="0"android:textColor="#000000"android:textSize="16sp" /><Buttonandroid:layout_width="48dp"android:layout_height="48dp"android:onClick="increment"android:text="+" /></LinearLayout><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="16dp"android:layout_marginTop="16dp"android:text="price"android:textAllCaps="true" /><TextViewandroid:id="@+id/price_text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="$0"android:textColor="#000000"android:textSize="16sp" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:onClick="submitOrder"android:text="order" />
</LinearLayout>
复制代码

注意属性的设置,比如嵌套的 LinearLayout 高度应该为 "wrap_content",而不是 "match_parent"

字符串变量 (String Variables)

  1. 字符串变量是变量的一种数据类型,包括字母、符号、数字;同样是先声明后引用。

  2. 字符串变量的声明格式为

     数据类型 变量名 = "初始值";
    复制代码

(1)数据类型:String,注意首字母大写。
(2)变量名:命名规则可 Google 搜索 "variable names java" 找到 Oracle 的说明文档。通常变量名不能太长也不能短到一两个字母;若是一个单词则全小写;若是多个单词则用小驼峰命名法。
(3)=: 赋值符号,而不是等号。这里需要养成右手边阅读习惯,即把右边的值赋予左边的变量。另外,赋值符号两边各有一个空格,这种编程风格可提高代码的可读性。
(4)初始值:赋予变量的值,通常是字面值 (Literal),也可以为空;值在一对双引号 "..." 内,若要在其中添加双引号 ",需要在前面使用转义字符 \,即 \";若要换行则为 \n。转义序列可 Google 搜索 "java escape characters" 找到 Oracle 的说明文档。
(5)分号结尾。

  1. 字符串变量的赋值同样无需再指定数据类型,也具有右手边阅读习惯;类似 int(整型变量)的运算,字符串变量能用 + 号连接字符串 (String Concatenation),有许多组合方式:
    (1)"字符" + "字符"
    (2)"字符" + 数字
    (3)"字符" + 整形变量
    连接数字和其他变量时无需用双引号包括。组合其他变量时,仅改变字符串变量的一部分即可实现内容的更新。组合变量时注意添加空格。

Just Java App

In MainActivity.java

package com.example.android.justjava;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;import java.text.NumberFormat;/**
* This app displays an order form to order coffee.
*/
public class MainActivity extends AppCompatActivity {int quantity = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/*** This method is called when the order button is clicked.*/public void submitOrder(View view) {int price = quantity * 5;String priceMessage = "Total: $" + price;priceMessage = priceMessage + "\nThank you!";displayMessage(priceMessage);}/*** This method is called when the + button is clicked.*/public void increment(View view) {quantity = quantity + 1;display(quantity);}/*** This method is called when the - button is clicked.*/public void decrement(View view) {quantity = quantity - 1;display(quantity);}/*** This method displays the given quantity value on the screen.*/private void display(int number) {TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);quantityTextView.setText("" + number);}/*** This method displays the given quantity value on the screen.*/private void displayPrice(int number) {TextView priceTextView = (TextView) findViewById(R.id.price_text_view);priceTextView.setText(NumberFormat.getCurrencyInstance().format(number));}/*** This method displays the given text on the screen.*/private void displayMessage(String message) {TextView priceTextView = (TextView) findViewById(R.id.price_text_view);priceTextView.setText(message);}
}
复制代码

添加了一个 displayMessage method,使点击 ORDER 按钮显示的内容更多了。另外修改了 XML 代码,使控制数量的按钮布局改变了。效果如下图。

注意粘贴代码时的位置,尤其注意大括号的位置。 代码完成后,使用 Android Studio 的 Reformat Code 和 Rearrange Code 功能来润色代码。

课程 2B: 制作一款交互性应用相关推荐

  1. ps怎么把一个颜色替换成另一个颜色_图标设计,用PS制作一款小清新的拟物时钟...

    本篇教程通过PS制作一款干净清新的时钟图标教程,做起来也不复杂,但是不管复杂不复杂的东西,都必须动手制作才行,会用到图层样式,图层样式基本上一直是图标或者字体制作的常客,同学们根据教程来学习一下吧,相 ...

  2. 如何制作一款HTML5 RPG游戏引擎——第四篇,情景对话

    今天我们来实现情景对话.这是一个重要的功能,没有它,游戏将变得索然无味.所以我们不得不来完成它. 但是要知道,使用对话可不是一件简单的事,因为它内部的东西很多,比如说人物头像,人物名称,对话内容... ...

  3. 四针角oled屏连接arduino_使用Arduino开发板连接OLED显示屏制作一款智能手表

    我们大多数人都比较熟悉1602点阵液晶显示屏,它在许多项目中用于向用户显示一些信息.但是这些LCD显示器在他们能做的事情上有很多限制.在本篇文章中,我们将使用OLED显示Android智能手机的一些基 ...

  4. 小哥哥你有98K吗?利用Python制作一款多功能变声器!

    前言 好吧,关于这句小哥哥你有98K吗?出自别人口中经常说的玩笑话,我也略懂一些游戏嘛.不过不常玩,废话不多说,开始咱们今天的教程,非常简单! 利用Python制作一款多功能变声器! 咱们首先登陆百度 ...

  5. 如何制作一款HTML5 RPG游戏引擎——第五篇,人物人物特效

    上一次,我们实现了对话类,今天就来做一个游戏中必不可少的--人物类. 当然,你完全是可以自己写一个人物类,但是为了方便起见,还是决定把人物类封装到这个引擎里. 为了使这个类更有意义,我还给人物类加了几 ...

  6. 如何制作一款HTML5 RPG游戏引擎——第三篇,利用幕布切换场景

    开言: 在RPG游戏中,如果有地图切换的地方,通常就会使用幕布效果.所谓的幕布其实就是将两个矩形合拢,直到把屏幕遮住,然后再展开直到两个矩形全部移出屏幕. 为了大家做游戏方便,于是我给这个引擎加了这么 ...

  7. 如何制作一款HTML5 RPG游戏引擎——第二篇,烟雨+飞雪效果

    今天我们来实现烟雨+飞雪效果.首先来说,一款经典的RPG游戏难免需要加入天气的变化.那么为了使我们的RPG游戏引擎更完美,我们就只好慢慢地实现它. 本文为该系列文章的第二篇,如果想了解以前的文章可以看 ...

  8. 制作一款精美的 Qt IFW 安装程序

    对于 Qt IFW 来说,默认的安装界面并不吸引人.倘若要制作一款精美的安装程序,这显然是不够的,需要在此基础上进行一系列定制. 为了实现这个目的,一般需要自定义安装页面,对相关部件进行美化,并添加一 ...

  9. 如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏-第3部分

    这篇文章还可以在这里找到 英语 Create a Sprite-Cutting Game with Cocos2D! 本篇教程是由iOS教程组的成员Allen Tan发布的,Allen是一位iOS开发 ...

最新文章

  1. 不懂装饰器,就不是真正会 Python
  2. ndpi 流量协议分析
  3. pdf内容怎么复制到word文档里_pdf文件怎么放到word里?这招实在是太好用了
  4. 如何得到最后N位都是1的二进制数
  5. mysql workbench uml_Ubuntu 16.04下UML建模PowerDesigner的替代ERMaster和MySQL Workbench
  6. 嵌入式linux 面试题
  7. python运行脚本文件的3种方法
  8. 使用hping3进行DoS攻击
  9. Apache Rewrite详细配置与使用说明
  10. 分享史上java最牛逼 最简短的代码
  11. 上传附件,附件类型问题
  12. 练习:对十进制正整数求平方和
  13. C++ 对 C 兼容是什么意思?
  14. 实习生招聘丨DolphinDB星臾计划
  15. Metasploit的简单应用
  16. java 排班日历,排班考勤表的制作也很简单,赶快来试试吧
  17. cnPuTTY CAC 0.78.0.1—PuTTY CAC 0.78中文版本简单说明~~
  18. OpenCV第五章练习p163_5~8
  19. mac os版spyder 安装jieba报错 No module named ‘jieba‘
  20. java计算程序运行时间及时间单位换算

热门文章

  1. Angular2 指令
  2. Win32汇编基础1
  3. sphinx的配置和管理
  4. 关于单链表的几个问题
  5. Silverlight 4处理StartWith的BUG
  6. 手写一个动态代理实现,手写Proxy,手写ClassLoader,手写InvocationHandler
  7. 设计模式之单例模式8种实现方式,其一:饿汉式-静态常量饿汉式
  8. Shiro的多Realm验证的实现--shiro实现不同身份使用不同Realm进行验证
  9. SecureCRT 基本设置
  10. mysql的增加命令_如何为mysql增加自定义命令