Android编程权威指南(第二版)学习笔记(八)—— 第8章 使用布局与组件创建用户界面

本章主要介绍了一些进阶的界面设计知识,以及如何用图形化界面设计 UI (虽然不推荐日常使用,但是至少要知道,特别是在 Android Studio 2.2 推出之后,可以直接查看设计蓝图,更为直观并且容易调整细节)。

GitHub 地址:
完成第八章,未完成挑战
完成第八章的挑战

1. 样式(style) 与 主题(theme)

为什么我们需要样式(style)? 因为当界面有统一风格时,就不需要针对每一个控件单独写属性了,规定几种样式(style)即可。

style 是 XML 资源文件,含有用来描述组件行为和外观的属性定义。例如,下面的样式能让其显示的文字大小大于一般的值。

<style name="BigTextStyle">
    <item name="android:textSize">20sp</item>
    <item name="android:padding">3dp</item>
</style>

我们可以在 res/values/ 目录下的样式文件中写入自己需要的属性定义,然后再布局文件中以 @style/my_own_style(file name) 的形式引用

什么是主题(theme)呢?主题是各种样式的集合,从结构上来说,主体本身也是一种样式资源,不过它的属性指向了其他样式资源

主题属性引用 顾名思义就是将预定义的应用主题样式添加给指定组件,比如给 TextView 控件定义下面的属性:

<style="?android:listSeparatorTextViewStyle">

意味着告诉 Android 运行资源管理器:“在应用主题里找到名为 listSeparatorTextViewStyle 的属性。该属性指向其他样式资源,请将其资源的值放在这里。”

2. margin 与 padding

Android 布局文件中的 margin 和 padding 跟 Web 编程的一样,具体定义如下:

  • margin 指的是外边距,即指定视图组件之间的距离
  • padding 指的是内边距,即指定视图外边框与其内容间的距离

两者之间区别如下图:


margin 和 padding

3. dp、sp 及屏幕像素密度

Android 使用密度修饰 drawable 目录(如 drawable-xhdpi)下的图像文件会自动适配不同像素密度的屏幕。那么问题来了,加入图像完成了自动适配,但是边距无法缩放适配,或者用户配置了大于默认值的文字大小,会出现什么意外呢?

为了解决这些可能的问题,Android 提供了密度无关的尺寸单位(density-independent dimension unit)。使用这种单位,可在不同屏幕密度的设备上获得同样的尺寸。无需进行麻烦的转换计算,应用运行时,Android 会自动将这种单位转换成像素单位。

1. dp (dip, density-independent pixel) 密度无关像素

所谓密度无关,即和屏幕的像素密度没有关系。1dp 单位在设备的屏幕上总是等于 1/160 英寸。使用 dp 的好处是,无论屏幕密度如何,总能获得同样的尺寸。

px = dp * (dpi / 160)

其中,dpi 即等于我们常说的 ppi,计算公式即为

ppi = sqrt(屏幕横向像素数的平方 + 屏幕纵向像素数的平方)/ 屏幕对角线英寸数

那么常见的 mdpi, hdpi 是什么呢?对应关系如下图:


ppi 对应尺寸

也就是说 160ppi 像素密度的屏幕,又叫 mdpi 的屏幕,程序中写的 1dp 在上面呈现的就是 1 像素(pixel,px)。

2. sp (scale-independent pixel) 缩放无关像素

这种像素也与屏幕无关,但是与设置有关,一般用来设置文本的大小。

4. android:layout_weight 属性

在 LinearLayout 中,有这样一个特殊属性,它能让你自由分配摆放部件后的空间,避免大量留白。它就是 android:layout_weight,这里的 weight 是权重的意思,也就是说,每个部件都有自己的权重,用于分配摆放部件后剩余的空间。也就是说,如果两个部件权重都是 1 时,它们平分摆放它们之后的剩余空间。

但是这样就会出现一个问题,由于分配的是剩余的空间,所以在两个部件 layout_width 属性不一致(wrap_content 不算一致)时,layout_weight 属性不能使部件平分整块屏幕。如果想要平分怎么办呢?把两个部件的 layout_width 都设为 0dp 再保持其 weight 相等,也就是把整块屏幕都当做剩余空间,就能平分整块屏幕了。

5. 挑战练习:日期格式化

我使用的是 SimpleDateFormat 类,它能通过字符串来直接格式化 Date 类型的数据。

SimpleDateFormat sdf = new SimpleDateFormat("EEEE, MMM d, y", Locale.US);
mDateButton = (Button) v.findViewById(R.id.crime_date);      mDateButton.setText(sdf.format(mCrime.getDate()));

GitHub Page: kniost.github.io
简书://www.greatytc.com/u/723da691aa42

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容