打开eclicse,创建android工程。【file】-【new】-【android application project】
一路next,注意在第二步,取消【create activity】这一选项。
创建完成后。右键【src】-【new】-【package】创建包,默认为com.example.activitytest,点击【finish】完成即可。
现在右击com.example.activitytest包-【new】-【class】,会弹出新建类的对话框,我们创建一个名为FristActivity的类,并让它继承自Activity,点击【finish】完成创建。
项目中的任何活动都应该重写Activity的onCreate()方法,所以首先我们应该重写FirstActivity中的onCreate()方法,代码如下:
public class FirstActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//调用了父类的onCreate()方法
}
}
可以看到,它的onCreate()方法就是调用了父类的onCreate()方法,这只是默认的实现,后面我们还需要在里面加入很多自己的逻辑。
android程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的,接下来我们再创建和加载布局。
右击【res/layout】目录-【new】-【Android XML File】,会弹出创建布局文件的窗口。我们这个布局文件命名为first_layout,根据元素就默认选择为LinearLayout。
点击【finish】完成布局建设。
其中 graphicallayout是视图模式,可以看到界面是什么样的,first_layout.xml是代码模式,如图所示:
可以在xml文件里直接修改。
我们在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" >
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 1"
/>
</LinearLayout>
这里添加了一个Button元素,并将Button元素的内部增加了几个属性。
android:id是给当前的元素定义一个唯一标识符,之后可以在代码中对这个元素进行操作。
android:layout_width指定了当前元素的宽度。
android:layout_height指定了当前元素的高度。
android:text指定了元素中显示的文字内容。
这里整理了宽度和高度的常用几个值:
match_parent表示让当前元素和父元素一样宽。
wrap_content表示当前元素的高度只要能刚好包含里面的内容就行。
当然也可以指定具体像素的宽度和高度,自己实验。
重新回到FirstActivity,在onCreate()方法中加入如下代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//调用了父类的onCreate()方法
setContentView(R.layout.first_layout);
}
这里调用了setContentView()方法来给当前的活动加载一个布局,而在setContentView()方法中,我们一般都会传入一个布局文件的id。这里注意的是,我们使用的R,是com.example.activitytest包下的R文件,Android SDK还会自动提供一个Android包下的R文件,千万别使用错了。
所有的活动都要在AndroidManifest.xml中进行注册才能生效,我们打开AndroidManifest.xml给FirstActivity注册,代码如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".FirstActivity"
android:label="This is FirstActivity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
可以看到,活动的注册声明要放在<application>标签内,这里是通过<activity>标签来对活动进行注册的。
android:name指定具体注册哪一个活动(这里是com.example.activitytest.FirstActivity),由于最外层的<manifest>标签中已经通过package属性指定了程序的包名称com.example.activitytest,因此在注册活动时这一部分就可以省略了,直接使用.FirstActivity就足够了。
android:label指定活动中标题栏的内容,标题栏显示在程序的顶部。需要注意的是,给主活动指定的label不仅会成为标题栏中的内容,还会成为启动器(Launcher)中应用程序显示的名称。
之后在<activity>标签的内部我们加入了<intent-filter>标签,并且在这个标签里添加了
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER"/>
这两句声明。使该活动成为程序的主活动,即程序打开时显示的就是这个活动。如果你的程序没有声明任何一个活动作为主活动,这个程序仍然可以正常安装,只是你无法在启动器中看到或者打开这个程序。这种程序一般都是作为第三方服务提供其他的应用程序在内部进行调用的,如支付宝快捷支付服务。补充:如果有多个活动,把如下代码剪切到一个活动的相应位置,将设置该活动为程序的主活动,同一个程序中最多有一个主活动。代码如下:
<activity
android:name=".FirstActivity"
android:label="This is FirstActivity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
运行程序啦,效果图如下:
如何隐藏标题栏
打开FirstActivity,在onCreate()方法中添加如下代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//调用了父类的onCreate()方法
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
setContentView(R.layout.first_layout);
}
requestWindowFeature(Window.FEATURE_NO_TITLE);
这句话一定在
setContentView(R.layout.first_layout);
之前,否则会出错。效果图如下:
这活动中使用Toast提示信息
Toast是android系统提供的一中非常好用的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。
首先需要定义一个弹出Toast的触发点,比如界面上的button按钮,这里是当我们点击按钮的时候就弹出一个Toast。在onCreate()方法中添加代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//调用了父类的onCreate()方法
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
setContentView(R.layout.first_layout);
//定义Button变量
Button button1 = (Button)findViewById(R.id.button_1);
//设置button1的监听器
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
}
});
}
在活动中,可以通过findViewById()方法获取到在布局文件中定义的元素,这里我们传入R.id.button1,来得到按钮的实例,这个值是刚才在first_layout.xml中通过android:id属性指定的。findViewById()方法返回的是一个View对象,我们需要向下转成Button对象。得到按钮的实例之后,我们通过调用setOnClickListener()方法为按钮注册一个监听器,点击的时候就会执行监听器中的onClick()方法。所以弹出Toast的功能在onClick()方法中实现。
Toast的用法非常简单,通过静态方法makeText()创建出一个Toast对象,然后调用show()方法将Toast显示出来就可以了。这里需要注意的是,makeText()方法需要传入三个参数。第一个参数是Context,也就是Toast要求的上下文,由于活动本身就是一个Context对象,因此这里直接传入FirstActivity.this即可。第二个参数是Toast显示的文本内容,第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT和Toast.LENGTH_LONG。
现在重新运行程序,并点击一下按钮,效果如图:
在活动中使用Menu
首先在res目录下新建一个menu文件夹,步骤如下:
右击【res】-【New】-【Folder】,输入文件夹名menu,点击【finish】。接着在menu文件夹下再新建一个名叫main的菜单文件,右击menu文件夹-【New】-【Android XML File】,如图所示:
文件名输入main,点击【finish】完成创建。然后在main.xml中添加如下代码:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/add_item"
android:title="Add"
/>
<item
android:id="@+id/remove_item"
android:title="Remove"
/>
</menu>
android:title给这个菜单项指定一个名称。
这里指定了两个菜单项,一个名称为Add,一个名称为Remove。
然后打开FirstActivity,重写onCreateOptionsMenu()方法,代码如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
通过getMenuInflater()方法能够得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单了。inflate()方法接收两个参数,第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里我们传入R.menu.main,也就是我们刚刚创建的菜单资源,第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中,这里直接使用onCreateOptionsMenu()方法中传入的menu参数。然后给这个方法返回true,表示允许创建的菜单显示出来,如果返回false,创建的菜单将无法显示。
接下来我们给每一个菜单项定义菜单响应事件,在FirstActivity中重写onOptionsItemSelected()方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.add_item:
Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
通过item.getItemId()来判断我们点击的是哪一个菜单项。
重新运行程序,并按下Menu键,效果图如下:
补充:模拟器快速键
Home键 - Home
Back键 - Esc
Menu键 - F2
拨号键 - F3
挂断键 - F4
搜寻键 - F5
网络开关 - F8
旋转荧幕 -Ctrl+F11
销毁一个活动
通过按键Back可以销毁当前活动,也可以通过代码实现,我们可以调用Activity类提供的finish()方法,来销毁当前活动,修改按钮监听器中的代码,代码如下:
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
重新运行程序,这时点击一下按钮,当前的活动就被成功销毁了,效果和按下Back键是一样的。
使用Intent在活动之间切换,穿梭吧
1. 再创建一个活动,作为FirstActivity的跳转目标活动。新建一个second_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" >
<Button
android:id="@+id/button_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 2" />
</LinearLayout>
还是定义一个按钮,按钮上显示Button 2。然后新建活动SecondActivity继承自Activity,代码如下:
package com.example.activitytest;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
}
}
最后在AndroidManifest.xml中为SecondActivity进行注册。代码如下:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".FirstActivity"
android:label="This is FirstActivity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"></activity>
</application>
由于SecondActivity不是主活动,因此不需要配置<intent-filter>标签里的内容。
接下来就要通过intent在第一个活动中启动第二个活动了。Intent的用法大致可以分为两种,显示Intent和隐式Intent。
1. 显示Intent的方法。
修改FirstActivity中按钮的点击事件,代码如下:
package com.example.activitytest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
public class FirstActivity extends Activity {
private Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.first_layout);
button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}
Intent(ContextpackageContext, Class<?>cls)这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent的“意图”。Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent参数,这里我们将构建好的Intent传入startActivity()方法就可以启动目标活动了。
重新运行程序,在FirstActivity的界面点击一下按钮,结果如图所示:
1. 使用隐式Intent
通过在<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category,打开AndroidManifest.xml,添加如下代码:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在<action>标签中我们指明了当前活动可以响应com.example.activitytest.ACTION_START这个action,而<category>标签则包含了一些附加信息,更精确的指明了当前的活动能够响应的Intent中还可能带有的category。只有<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent。
修改FirstActivity中按钮的点击事件,代码如下:
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
}
});
可以看到,我们使用了Intent的另一个构造函数,直接将action的字符串传了进去,表明我们想要启动能够响应com.example.activitytest.ACTION_START这个action活动。其中android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。
重新运行程序,在FirstActivity的界面点击一下按钮,你同样成功启动SecondActivity了。不同的是,这次你是使用了隐式Intent的方式来启动,说明我们在<activity>标签下配置的action和category的内容已经生效了!
每个Intent中只能指定一个action,但去能指定多个category。目前我们的Intent中只有一个默认的category,那么现在再来添加一个吧。
修改FirstActivity中按钮的点击事件,代码如下:
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
可以调用Intent中的addCategory()方法来添加一个category,这里我们指定了一个自定义的category,值为com.example.activitytest.MY_CATEGORY。再在<intent-filter>中再添加一个category的声明,代码如下:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>
再次重新运行程序,实验成功!
更多隐式Intent的用法
修改FirstActivity中按钮点击事件的代码:
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.VIEW。然后通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去。
重新运行程序,效果如下: