<献词
献给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)工作区
Eclipse即将从Android历史舞台退出,所以大家还是多学习AS就好!
1.4 用户界面设计
这里我在插一嘴,Material Design,Google推出的全新的设计语言
开始上代码
默认的activity布局(activity_quiz.xml)
我们看到,应用activity的布局默认定义了两个组件(widget):RelativeLayout
和TextView
组件:
是组成用户界面的构造模块。组件可以显示文字或图像,与用户交互,甚至是布置屏幕上的其他组建。
按钮(Button),文本输入控件(EditText),选择框(CheckBox)等都是组件。
Android SDK内置了多种组件,通过配置各种组建可获得所需要的用户界面及行为。每一个组件是View类或其子类(如TextView 或 Button)的一个具体实例。
现在开始GeoQuiz应用介绍
QuizActivity的用户界面需要下列五个组件:
- 一个垂直LinearLayout组件;
- 一个TextView组件;
- 一个水平LinearLayout组件;
- 两个Button组件;
看看以上组件是如何构成QuizActivity用户界面的
然后看看这个布局代码:
求助,谁知道这个问题怎么解决。我用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里定义的名字 来引用即可。如:
正确
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编译过程