一、Activity的简要理解
上篇博文已经知道如何编写一个简单的Activity了,可能有很多初学者会疑惑到底什么是Activity?我们来给出Activity的一个通俗的解释:Activity就是呈现在我们手机上的各种界面,也就是说,只要在手机上我们能看到的,都是Activity。任何一个Activity都需要继承android.app.Activity才能有显示界面的“本领”,当一个类继承自android.app.Activity,那么系统就会为其分配一个透明的布满手机屏幕的PhoneWindow(窗口),然后在onCreate里利用setContentView把布局填充至这个PhoneWindow,大多数布局都是铺满整个窗口的,但也有一些例外,如,Dialog(对话框)虽然本质上也是Activity,但是它的布局并没有把整个窗口铺满;接下来我们在布局中“粘上”一系列的控件,如,Button(按钮)、CheckBox(开关)等,这样一来就构成了我们在手机上平常看到的各种界面。好了,现在我们已经知道,要实现一个Activity,需要以下几个步骤:
① 继承自android.app.Activity
② Android系统为其分配PhoneWindow
③ setContentView把布局载入PhoneWindow
④ 在AndroidManifest.xml中申明此Activity
AndroidManifest.xml是安卓程序的一个清单,相当于我们大家的档案,里面有对程序最全面而又最简洁的描述,Android系统需要对其进行解析,根据解析出的不同结果去做相应的事;我们来看看上一篇博文中HelloWorld中的AndroidManifest,对其关键地方进行简要的注释说明。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lushengduan.helloworld"> //这是包名,在同一个手机中,包名不能重复 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" //应用程序的图标,就是显示在桌面的图标 android:label="@string/app_name" //应用程序的名称,显示在图标下面的文字,如QQ,新浪微博 android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".HelloWorldActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
<activity ... </activity>中包裹的内容就是我们的HelloWorldActivity,必要的定义有两样,一个是“name”,另一个是“intent-filter”,android:name指的是“包名 + 类名”,而.HelloWorldActivity是把包名的省略了,用“.”来代替“com.example.lushengduan.helloworld”,这样也是常用的写法,每个Activity都写一遍包名,确实不是什么好的事情。intent-filter是intent的过滤器,intent我们暂时先不介绍,只需要记住,一个Activity要成为主界面(点开应用程序进入的第一个界面),在intent-filter中必须定义action为“android.intent.action.MAIN”,category为“android.intent.category.LAUNCHER”。
二、弹出一条Toast提示框
上一篇文章里,我们是通过java代码来实现布局的,但在Android开发里,更多的是使用xml布局文件,我们把HelloWorldActivity改成如下代码:
package com.example.lushengduan.helloworld; import android.app.Activity; import android.os.Bundle; /** * Created by Lushengduan on 2016/3/4. */ public class HelloWorldActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); } }
我们发现,上面的代码是通过“R.layout.main_layout”来载入布局的,至于为什么是“R.layout.xx”这个涉及到资源id,以后抽空再说,来先看看res/layout/main_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="HelloWorld!"/> </LinearLayout>
不管三七二十一,先把这个程序跑起来看看,是否能显示出来“HelloWorld!”这行文件,运行结果如下:
运行结果和前一篇文章是一样的,LinearLayout是线性布局,TextView是一个显示文字控件,android:text的内容将会被显示出来;接下来,我们来为主界面添加一个Button,让按钮上显示的文字为“CLICK ME!”
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="HelloWorld!"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="CLICK ME!"/> </LinearLayout>
运行一下,看看结果:
一般情况下,点击一下Button都会系统都会有响应,如在DeskClok里的秒表界面,点击“开始”这个Button,秒表开始计时;现在我们需要实现一个功能:点击一下“CLICK ME!”,然后弹出一个Toast提示框,先给Button控件添加onClick属性
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="showToast" android:text="CLICK ME!"/>
设定onClick的值为“showToast”的话,根据onClick的值,就可以在HelloWorldActivity里定义一个名称为“showToast”的方法;当我们点击“CLICK ME!”按钮后,就会去调用showToast函数,然后利用Toast弹出所需要的提示框;鉴于大多数人都喜欢“20岁以下的妹子”,弹出的内容就似乎它了
public void showToast (View view){ Toast.makeText(this, "I like the girls under the age of 20!!", Toast.LENGTH_LONG).show(); }
Toast提示框需要三个参数
① Context上下文:Activity本身也是Context,所以第一个参数用“this”(this就是HelloWorldActivity自己)
② 需要显示的文字:这个没什么好说的,想写什么写什么
③ 提示框显示时长:这里设置为长时间
写完后,不要忘记把提示框“show”出来,很多初学者就把.show()忘了加上,然后发现根本不会弹出提示框;还有此方法没有返回值,且参数是View类型的;好了,运行一下看看结果: