《Android编程权威指南》学习记录(一)

Android编程权威指南

<献词
献给Donovan。他很忙,但他知道什么时候该用Fragment。
——B.H

<聚焦习惯而不是目标


Android 应用初体验

我们要做一个测试用户地理知识的软件 GeoQuiz,然后我们会从中学到Android开发基础知识

1.1 应用基础

这部分算是简单的需求分析,我们的应用需要什么,有哪部分组成。
在开发一个应用之前我们要对自己的应用有足够的认识,需要用到什么框架,哪些技术点,哪些jar包等

GeoQuiz应用是由一个Activity 和一个布局(Layout)组成。

Activity

activity 是Android SDK中 Activity类的一个具体实例,负责管理用户与信息屏的交互。应用的功能是通过编写一个个Activity子类来实现的。

布局(Layout)

布局 定义了一系列用户界面对象以及它们显示在屏幕上的位置。

1.2 创建 Android项目

首先我们来创建一个Android项目。Android项目包含组成一个应用的全部文件。(书中用的IDE是 Eclipse,所以具体创建项目的步骤这里就不写了。)

注意:
1.包名命名规则:包名要遵循“DNS反转” 约定,即将企业组织或公司的域名反转后,在尾部附加上应用名称。遵循此约定可以保证包名的唯一性。
2.Activity命名规则:创建子类activity时,最好是遵守“名字+Activity后缀” 如:QuizActivity=Quiz+Activity。尽管不是必需的,但是建议遵守这一命名约定。
3.布局命名规则:将activity名称的单词顺序颠倒过来,并全部转换为小写字母,然后在单词间添加下划线。如:activity_quiz。

这里加一个链接,大神总结的 Android 命名规范

1.3 Eclipse 工作区导航

在这贴一张AS(Android Studio)工作区


Android Studio工作区

Eclipse即将从Android历史舞台退出,所以大家还是多学习AS就好!

1.4 用户界面设计

这里我在插一嘴,Material Design,Google推出的全新的设计语言

开始上代码

默认的activity布局(activity_quiz.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.magee.geoquiz.QuizActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>
</RelativeLayout>

我们看到,应用activity的布局默认定义了两个组件(widget)RelativeLayoutTextView

组件:
是组成用户界面的构造模块。组件可以显示文字或图像,与用户交互,甚至是布置屏幕上的其他组建。
按钮(Button),文本输入控件(EditText),选择框(CheckBox)等都是组件。
Android SDK内置了多种组件,通过配置各种组建可获得所需要的用户界面及行为。每一个组件是View类或其子类(如TextView 或 Button)的一个具体实例。


现在开始GeoQuiz应用介绍

QuizActivity的用户界面需要下列五个组件:

  • 一个垂直LinearLayout组件;
  • 一个TextView组件;
  • 一个水平LinearLayout组件;
  • 两个Button组件;

看看以上组件是如何构成QuizActivity用户界面的


布置并显示在屏幕上的组件

然后看看这个布局代码:

<?xml version="1.0" encoding="utf-8"?>
<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:gravity="center">
    <TextView
        android:padding="24dp"
        android:text="@string/question_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/true_button"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/false_button"/>
    </LinearLayout>
</LinearLayout>

求助,谁知道这个问题怎么解决。我用Eclipse的代码全部复制过来就是原来的样子显示。我找了一下午没找到办法,所以下次代码只能在Eclipse中写了。不能让我写完代码了还一个一个加空格,手动格式化显示吧?```

视图层级结构

布局中组件及属性的层级结构

需要注意的是,根元素(当前布局中就是最上面的LinearLayout组件)必须指定Android XML资源文件的命名空间属性(命名空间属性就是xmlns,XML Namespaces),当前就是xmlns:android=" http://schemas.android.com/apk/res/android "。

LinearLayout组件继承自View子类的ViewGroup组件。ViewGroup组件是一个包含并配置其他组件的特殊组件。在这先灌输一下Android的五大组件LinearLayout,RelativeLayout,FrameLayout,TableLayout,AbsoluteLayout(这个是绝对布局,正常情况下不会用到)

组件属性

属性 可以看作是如何配置 组件 的指令。
下面我们来看一些常用属性。

  • android:layout_width和android:layout_height:
    几乎每类组件都需要这两个属性,他们通常被设置为一下两种属性值之一。
    *match_parent:视图与其父类视图大小相同
    *wrap_content:视图将根据其内容自动调整大小。
    (以前还有一个fill_parent属性值,等同于match_parent,目前已废弃不用。)
  • android:orientation属性
    它是LinearLayout组件特有的属性,可以指定子组件在屏幕上排列的方向。其两个属性值vertical 和 horizontal分别表示垂直排列和水平排列。
  • android :text属性
    该属性指定组件显示的文字内容。这里需要知道android:text的属性最好是从strings的XML文件中引用过来的字符串资源(下面会学习),不要在代码中以硬编码的形式赋值。

创建字符串资源

每个项目都包含一个名为strings.xml的默认字符串文件。当我们要添加字符串资源时候可以在这里定义,而我们只需要@string/在strings.xml里定义的名字 来引用即可。如:

<string name="true_button">正确</string>
android:text="@string/true_button"
这时候android:text的属性值就是“正确”。

从布局XML到视图对象

XML元素是如何转换为视图对象的?

答案就在Activity的onCreate(Bundle)方法中的setContentView()中。
我们只需要把我们创建好的XML布局ID传给setContentView()方法中即可。如:
setContentView(R.layout.activity_quiz)

该方法生成指定布局的视图并将其放置在屏幕上。布局视图生成后,布局文件包含的组件也随之以各自的属性定义完成实例化。

资源与资源ID

布局 是一种 资源 。资源是应用非代码形式的内容,比如图像文件,音频文件以及XML文件等。项目中所有的资源文件都存放在目录res的子目录下。

这里我们要学习一个新的属性:android :id ="@+id/id名"

当我们需要某一个控件的时候,可以用它的id来查找获取。(后面会讲)

组件的实际应用

按照顺序来写:

  • 首先,我们要定义一个组件类型的成员变量,并且给变量取名

private Button mTrueButton;

  • 然后通过Activity的方法引用已生成的组件,方法为:

public View findViewById(int id)
该方法接受组件的资源ID作为参数,返回一个View(视图)对象。

mTrueButton=(Button)findViewById(R.id.true_button);

这样,我们就已经获得了该组件的实例变量mTrueButton

设置监听器

Android应用属于典型的事件驱动类型 。事件驱动类型应用启动后,即开始等待行为事件的发生,如用户点击某个按钮。

应用等待某个特定事件的发生,也可以说该应用正在“监听”特定事件。为响应某个事件而创建的对象叫做监听器(listener)监听器 是实现特定监听器接口 的对象,用来监听某类事件的发生。

无需自己编写,Android SDK已经为各种事件内置开发了很多监听器接口。当前应用需要监听用户的按钮“单机”事件,因此监听器需实现 View.OnClickListener 接口

mTrueButton.setOnClickListener(new View.OnClickListener(){  
 @Override 
 public void onClick(View v){
  这里写点击后实现的方法
 } 
});
  • 使用匿名内部类
    SetOnClickListener(OnClickListener)方法的监听器参数是一个匿名内部类
    用匿名内部类的两大好处:

1,因为匿名内部类的使用,我们可在同一处实现监听器方法,代码更清晰可读。
2,事件监听器一般只在一处使用一次,使用匿名内部类可避免不必要的命名类实现。

  • 创建提示消息

Toast 是Android中显示消息的机制,它没有交点,而且有时间限制。过一定时间就会自动消失。

通过调用来自Toast类的一下方法创建toast:

 public static Toast makeText(Context context,int resId,int duration)

该方法的Context参数通常是Activity的一个实例(Activity本身就是Context的子类)。
第二个参数是toast待显示字符串消息的资源ID。Toast类必须利用context才能找到并使用字符串的资源ID。
第三个参数通常是两个Toast常量中的一个用来指定toast消息显示的持续时间。
创建Toast后,可通过调用Toast.show()方法使toast消息显示在屏幕上。

Toast.makeText(QuizActivity.this,"我是吐司",Toast.LENGTH_SHORT).show();

使用模拟器运行应用

虽然Eclipse和Android Studio都自带有模拟器,但是我还是建议大家用手机测试,或者用Genymotion测试。因为自带的,真的好慢。(不过据说AS2.2的模拟器已经很快了)

深入学习:Android编译过程

android编译过程

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • Day1: 在代码中通过R.string.hello_world可以获得该字符串的引用; 在XML中通过@stri...
    冰凝雪国阅读 1,357评论 0 5
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,201评论 0 17
  • (7)你的野心很大。 霍瑜合上顾子萱送过来的报告:“下一季度,同比增长百分值二十,全年环比增长百分之二十四点五。顾...
    亚珈昱阅读 269评论 0 0
  • 在步入山东水利职业学院前,我曾无数在小说中看见大学的种种风光岁月,脑中也曾无限遐想着大学乐园。 曾经的我就是从小听...
    山东水利职业学院专题阅读 884评论 0 2