Android应用开发基础-实验指导书

时间:2024.4.20

Android应用开发基础

实 验 指 导 书

软件学院 软件工程系

包 晗

实验内容

实验一 熟悉Android环境

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解Android SDK的安装、配置、使用。

2.熟悉ADT组件, 开发工具eclipse的使用。

3.熟悉Android程序的基本框架。

【实验内容】

一、安装JDK1.6,下载网址:/javase/downloads/。

Android应用开发基础实验指导书

图1

二、安装Eclipse3.5,下载网址:/downloads/。

三、在Eclipse3.5上安装ADT-10.0.1插件。在Eclipse中help菜单下选中Install New Software?,在弹出的对话框中(见图2)点add按钮,Name文本框里写ADT,Location文本框里输入Android插件的路径: https://dl-/android/eclipse/。如果你已经下载了ADT,点击Archive?按钮直接指定磁盘中的ADT包。

Android应用开发基础实验指导书

图2

四、安装Android SDK 2.x,下载网址:。在Eclipse中选择“Window”>“Preference”,从左侧的列表中选择Android项,在SDK设置SDK Location中,点击“Browse”?按钮;选择Android,SDK的目录,点击“OK”按钮。

图3

五、完成第一个工程,屏幕上显示hello。在Eclipse的菜单中,选择“Window”>“Android AVD Manager”,出现“Android SDK and AVD Device Manager”窗口:界面中间的列表表示了目前可以使用的Android虚拟设备,在没有虚拟设备的情况下点击右侧的New选择建立一个虚拟设备。

Android应用开发基础实验指导书

图4

建立新的Android虚拟设备的窗口为Create new AVD,如图5所示

Android应用开发基础实验指导书

Android应用开发基础实验指导书

5

在“Android SDK and AVD Device Manager”窗口中,选择一个设备,点击右侧的Start,将启动虚拟设备,选中Scale Display选项,调整虚拟机屏幕大小。 在Eclipse中选择新建Android工程,选择Android SDK版本,activity名称,包名,点finish。

打开res下layout,双击main.xml,此时看到的就是程序主页面,可以放置ui组件,可以修改显示的字符串,双击字符串进入xml编辑界面进行修改。查看src下MainActivity.java文件、gen下R.java文件、res下layout下main.xml文件,观察并熟悉这些文件的基本结构和彼此之间的联系。

【参考程序】

MainActivity.java

public class MainActivity extends Activity {

/** Called when the activity is first created. */ @Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

View v = null;

Button button = new Button(this);

R.java

public final class R {

public static final class attr {

}

public static final class drawable {

public static final int icon=0x7f020000;

}

public static final class layout {

public static final int main=0x7f030000;

}

public static final class string {

public static final int app_name=0x7f040001;

public static final int hello=0x7f040000;

}

}

main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

/>

</LinearLayout>

【思考题】

1.在main.xml中添加的ui组件,如何在MainActivity.java中加以引用?

实验二 Activity组件的生命周期

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解Activity组件的生命周期。

2.了解Activity组件的运行状态。

3.了解Activity组件的状态维护。

4.掌握Activity组件的窗口。

【实验内容】

实验题1.熟悉Activity组件的生命周期变化,创建一个Android工程,为活动起名为First,建好后在First.java中根据书中代码添加代表Activity生命周期的五个方法:onDestroy(),onPause(),onResume(),onStart(),onStop()。在调试窗口观察Activity组件的生命周期的调用情况。

实验题2.在前面的程序基础上增加一个按钮,使得按下按钮系统调用finish()方法来结束Activity。参考实验一中界面处理的方法,为界面添加一个按钮,然后需要在First.java中添加下面代码。

【参考程序】

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Log.i(Activity_ID, "oncreate has been called");

Button finish=(Button)findViewById(R.id.testfinish);

finish.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

finish();//退出activity

}

});

}

实验题3.练习操作Activity的窗口。

全屏显示:使Activity在启动的时候能铺满全屏,只要在onCreate()方法内super.onCreate(savedInstanceState);语句后加上下面代码

this.requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.main);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

定制窗口标题:窗口标题实际上就是在界面上添加一个title.xml文件,代码如下 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="/apk/res/android"

android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:text="定制标题" /> <ProgressBar android:layout_height="wrap_content" android:layout_gravity="center_vertical"

style="?android:attr/progressBarStyleSmallTitle"

android:layout_width="wrap_content"

android:id="@+id/progress"></ProgressBar>

</LinearLayout>

同时需要修改First.java中的onCreate()方法,参考书中代码。

为窗口应用风格:设置风格可以保持所有Activity窗口的风格一致,在AndroidManifest.xml文件中Activity节点中增加一个属性android:theme即可实现,可以设置属性值为@android:style/Theme.Dialog

实验三 界面布局的创建

【实验类型】设计性

【实验要求】必做

【实验目的】

1. 掌握用户界面结构。

2. 掌握定义界面布局方法。

3. 掌握声明界面布局方法。

【实验内容】

实验题1. 创建一个Android工程,活动名称为Main.java,要求界面放置两个按钮,使用LinearLayout布局类,按照创建布局的步骤编写代码:①创建ui组件对象。②设置ui组件属性(设置按钮名称)。③创建布局对象。④设置布局对象属性(设置布局排列方向)⑤调用addView()方法将ui组件添加到布局中。

实验题2. 在上一个工程的基础上,添加一个名为show_layout.xml的布局文件,熟悉声明界面布局的方法。参考工程已经建好的main.xml文件结构,放置四个TextView组件,起名为rowone、rowtwo、rowthree、rowfour。最后将程序的界面设为新建的界面。

实验题3. 在实验2的基础上添加id属性,练习引用声明的ui,在show_layout.xml文件中,将第一个TextView组件添加一个id属性,代码如下:

【参考程序】

show_layout.xml中添加代码

<TextView android:id="@+id/my_textview" android:text="row one" android:textSize="15pt"

android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" />

main.java中onCreate()方法改为

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.show_layout);

TextView myTextView = (TextView) findViewById(R.id.my_textview); myTextView.setText("changed !!");

实验四 熟悉布局类

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解LayoutParams类的使用。

2.掌握LinearLayout类的使用。

3.掌握TableLayout类的使用。

4.掌握RelativeLayout类的使用。

5. 掌握FrameLayout类的使用。

【实验内容】

实验题1. 练习LinearLayout布局。创建一个Android工程,活动名称为Main.java,新建Android XML file,起名为line1.xml,并把程序启动时的布局设为line1.xml。

【参考程序】

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

>

<EditText

android:layout_width="fill_parent"

android:layout_height="wrap_content" />

<LinearLayout android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:gravity="right">

android:layout_width="wrap_content"

android:layout_height="wrap_content" xmlns:android="/apk/res/android" <Button

android:text="确定"/>

<Button

android:layout_width="wrap_content" android:layout_height="wrap_content"

/> android:text="取消"

</LinearLayout>

</LinearLayout>

根据书中代码编写line2.xml和ratioline.xml两个文件,体会layout_weight属性。

实验题2. 练习TableLayout布局。在上一个工程中,新建Android XML file,

起名为table1.xml,并把程序启动时的布局设为table1.xml。

【参考程序】

<?xml version="1.0" encoding="utf-8"?>

<TableLayout

xmlns:android="/apk/res/android" android:id="@+id/menu"

/>

/>

android:layout_width="fill_parent" android:stretchColumns="1"> <TableRow> <TextView android:layout_column="1" android:text="打开..." android:padding="3dip" /> <TextView android:text="Ctrl-O" android:gravity="right" android:padding="3dip" /> android:layout_height="fill_parent" </TableRow> <TableRow> <TextView android:layout_column="1" android:text="保存..." android:padding="3dip" /> <TextView android:text="Ctrl-S" android:gravity="right" android:padding="3dip" /> </TableRow> <TableRow> <TextView android:layout_column="1" android:text="另存为..." android:padding="3dip" /> <TextView android:text="Ctrl-Shift-S" android:gravity="right" android:padding="3dip" /> </TableRow> <View android:layout_height="2dip" android:background="#FF909090" <TableRow> <TextView android:text="*" android:padding="3dip" /> <TextView android:text="导入..." android:padding="3dip" /> </TableRow> <TableRow> <TextView android:text="*" android:padding="3dip" /> <TextView android:text="导出..." android:padding="3dip" /> <TextView android:text="Ctrl-E" android:gravity="right" android:padding="3dip" /> </TableRow> <View android:layout_height="2dip" android:background="#FF909090" <TableRow> <TextView android:layout_column="1" android:text="退出" android:padding="3dip" />

</TableRow> <TableRow> android:id="@+id/mybutton" android:layout_column="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" <Button

android:text="隐藏"/></TableRow>

</TableLayout>

实验题3. 练习RelativeLayout布局。在上一个工程中,新建Android XML file,起名为relative.xml,并把程序启动时的布局设为relative.xml。

【参考程序】

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

xmlns:android="/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:padding="5px">

<TextView android:id="@+id/label"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="URL:"

android:layout_alignBaseline="@+id/entry"

android:layout_alignParentLeft="true"/>

<EditText

android:id="@id/entry"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_toRightOf="@id/label"

android:layout_alignParentTop="true"/>

<Button

android:id="@+id/ok"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@id/entry"

android:layout_alignRight="@id/entry"

android:layout_marginTop="5px"

android:text="OK" />

<Button

android:id="@+id/cancel"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_toLeftOf="@id/ok"

android:layout_marginRight="5px"

android:layout_alignTop="@id/ok"

android:text="Cancel" />

</RelativeLayout>

实验题4. 练习FrameLayout布局。在上一个工程中,新建Android XML file,起名为frame.xml,并把程序启动时的布局设为frame.xml。

【参考程序】

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="/apk/res/android" android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView android:id="@+id/textview1"

android:layout_width="300dp"

android:layout_height="300dp"

android:layout_gravity="center"

android:background="#FF33ffff" />

<TextView android:id="@+id/textview2"

android:layout_width="240dp"

android:layout_height="240dp"

android:layout_gravity="center"

android:background="#FF33ccff" />

<TextView android:id="@+id/textview3"

android:layout_width="180dp"

android:layout_height="180dp"

android:layout_gravity="center"

android:background="#FF3399ff" />

<TextView android:id="@+id/textview4"

android:layout_width="120dp"

android:layout_height="120dp"

android:layout_gravity="center"

android:background="#FF3366ff" />

<TextView android:id="@+id/textview5"

android:layout_width="60dp"

android:layout_height="60dp"

android:layout_gravity="center"

android:background="#FF3300ff" />

</FrameLayout>

实验五 资源管理

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解资源存储。

2.了解资源映射。

3.了解资源命名。

4.了解资源访问。

5.了解资源国际化。

【实验内容】

实验题1. 找到实验1中的hello工程,重新学习Android工程中的资源映射、资源命名和资源访问。

实验题2. 练习Nine-Patch图片做背景图片。创建一个Android工程,活动名称为Main.java,新建Android XML file,起名为ninepatch.xml,并把程序启动时的布局设为ninepatch.xml。

【参考程序】

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="/apk/res/android"

android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content"

android:background="@drawable/button9"

android:layout_height="wrap_content"></Button> <Button android:text="Button" android:id="@+id/button1" android:layout_width="200dip" android:layout_weight="1" android:background="@drawable/button9" android:layout_height="wrap_content"></Button>

</LinearLayout>

实验题3. 练习使用XML资源文件来定义颜色。在上一个工程中,在res/values下新建Android XML file,起名为color.xml。

【参考程序】

<?xml version="1.0" encoding="utf-8"?>

<resources>

<color name="mycolor">#7fff00ff</color>

</resources>

实验题4. 练习使用StateList资源。在上一个工程中,在res/drawable下新建一个Colorlist资源,起名为buttoncolor.xml。在布局文件main.xml中增加一个button,并将Colorlist资源绑定到此button,代码见书程序5-9.

【参考程序】

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="/apk/res/android">

<item android:color="#00ff00" />

<item android:state_pressed="true" android:color="#ff0000" />

</selector>

实验题5. 练习资源国际化。在上一个工程中,在res/values下新建一个strings.xml。通过修改模拟器的语言和地区,查看程序结果变化。

【参考程序】

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="hello">\"Hello World, main!\"\n\r i am hyl</string>

<string name="format_string">

Hello %2$s ha ha. %1$s again

</string>

<string name="app_name"></string>

</resources>

实验六 intent的调用

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解Intent的组成。

2.了解Intent Filter的功能。

3.了解Intent解析机制。

4.掌握Intent的调用方法。

5.掌握Intent传递数据的方法。

【实验内容】

实验题1. 熟悉Intent Filter的功能,了解Intent解析机制,显式及隐式调用intent。创建一个Android工程IntentDemo.pro,活动名称main,添加四个类ActivityOne、ActivityTwo、ServiceOne、ServiceTwo,新建两个布局activityone、activitytwo,主界面放置四个按钮,前两个按钮的功能是把界面切换到activityone、activitytwo。后两个按钮可以在调试窗口看到启动服务的说明文字。活动代码参考书程序6-2、程序6-3、程序6-4、程序6-5、程序6-6、程序6-7,界面布局代码如下:

【参考程序】

main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<Button android:text="activity1"

android:id="@+id/activity1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

<Button android:text="activity2"

android:id="@+id/activity2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

<Button android:text="service1" android:id="@+id/service1" android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

<Button android:text="service2" android:id="@+id/service2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

</LinearLayout>

activityone.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView android:text="hello activity one"

android:id="@+id/TextView01"

android:layout_width="wrap_content"

android:layout_height="wrap_content"></TextView>

</LinearLayout>

activitytwo.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView android:text="hello activity two"

android:id="@+id/TextView01"

android:layout_width="wrap_content"

android:layout_height="wrap_content"></TextView>

</LinearLayout>

实验题2. 在1题的基础上,通过修改main.java及ActivityOne.java的代码,实现通过intent在活动之间传递数据:

【参考程序】

main.java中修改按钮1的监视器方法:

firstbtn.setOnClickListener(new View.OnClickListener() { @Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent();

intent.putExtra("str1", "我是传递的信息");

intent.setClass(mainActivity.this,otherActivit

y.class);

startActivity(intent);

} });

ActivityOne.java中需要修改onCreate()方法,布局中添加一个TextView组件: private TextView textView;

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

this.setContentView(R.layout.other);

textView = (TextView)

this.findViewById(R.id.textView1);

Intent intent =this.getIntent();

Bundle bundle = intent.getExtras();

String str1 = (String) bundle.get("str1");

textView.setText("传递过来的信息是 "+str1); }

实验七 实现Activity之间的协同

【实验类型】设计性

【实验要求】必做

【实验目的】

1.了解在Intent中传递复杂对象的方法。

2.了解Intent与ShortCut。

3.掌握实现Activity之间的协同。

【实验内容】

实验题1. 练习传递对象。创建一个Android工程,活动名称main,代码见书程序6-10,新建一个类student,代码见程序6-9,新建一个活动activityone,用来接收对象,代码见程序6-11。

实验题2.练习Activity之间的协同。创建一个Android工程,活动名称

Activity_comm_1.java,主界面activity_comm_1.xml,新建一个活动,活动名称Activity_comm_2.java,切换界面activity_comm_2.xml。主界面要求:包含一个TextView组件和一个Button组件。当单击Button组件时,将启动Activity_comm_2的布局对TextView的内容进行编辑。切换界面要求:编辑TextView的内容的编辑框、按钮【保存】、按钮【放弃】。当单击【保存】按钮,将返回主界面,并把编辑的文本更新显示在TextView中,单击【放弃】按钮也将返回主界面,但之前编辑的操作将被放弃。

实验题3.练习Intent与ShortCut,实现为界面上的组件创建快捷方式。创建一个Android工程,活动名称main.java,主界面main.xml,增加一个活动ShortCut.java,参考代码如下:

【参考程序】

ShortCut.java

package com.demo.intent;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.os.Parcelable;

public class ShortCut extends Activity {

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

final Intent intent = getIntent();

final String action = intent.getAction();

if (Intent.ACTION_CREATE_SHORTCUT.equals(action)) {

setupShortcut();

finish();

return;

}

setContentView(R.layout.shortcut);

}

private void setupShortcut() {

Intent shortcutIntent = new Intent(Intent.ACTION_MAIN);

shortcutIntent.setClassName(this, "com.demo.intent.main");

Intent intent = new Intent();

intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "shortcutsample"); Parcelable iconResource =

Intent.ShortcutIconResource.fromContext(this,

R.drawable.icon);

intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);

setResult(RESULT_OK, intent);

}

}

main.java

package com.demo.intent;

import java.util.ArrayList;

import java.util.HashMap;

import android.app.Activity;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class main extends Activity {

public static final String User_ACTION = "com.demo.intent.Useraction"; public static final String User_ACTION2 = "com.demo.intent.Useraction2"; @Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button firstbtn = (Button) findViewById(R.id.activity1);

Button firstbtnservice = (Button) findViewById(R.id.service1);

Button secondbtn = (Button) findViewById(R.id.activity2);

Button secondbtnservice = (Button) findViewById(R.id.service2); Button choose = (Button) findViewById(R.id.Button01);

Button create = (Button) findViewById(R.id.Button_createshortcut); Button delete = (Button) findViewById(R.id.Button_deleteshortcut);

firstbtn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

// 显式启动 Activity One

Intent i = new Intent(getApplicationContext(),

ActivityOne.class);

Bundle bd = new Bundle();

Student s = new Student();

HashMap<String, String> sc = new HashMap<String, String>(); sc.put("english", "98");

sc.put("computer", "75");

s.name = "tom";

s.scores = sc;

ArrayList<Student> al = new ArrayList<Student>();

al.add(s);

i.putParcelableArrayListExtra("attachment2", al);

bd.putString("username", "android");

i.putExtra("attachment", bd);

startActivity(i);

}

});

firstbtnservice.setOnClickListener(new View.OnClickListener() { public void onClick(View v) {

Intent i = new Intent(getApplicationContext(),

ServiceOne.class);

startService(i);

}

});

secondbtn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

Intent intent = new Intent();

// intent.setAction(User_ACTION);

intent.setAction(Intent.ACTION_VIEW);

intent.setData(Uri.parse(".hk")); startActivity(intent);

startActivity(intent);

}

});

secondbtnservice.setOnClickListener(new View.OnClickListener() { public void onClick(View v) {

Intent intent = new Intent();

intent.setAction(User_ACTION2);

startService(intent);

}

});

choose.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setDataAndType(Uri.parse("file:///sdcard/a.mp3"), "audio/music1");

// startActivity(intent);

startActivity(Intent.createChooser(intent, "选择音乐播放器")); }

});

create.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

Intent shortcut = new Intent(

"com.android.launcher.action.INSTALL_SHORTCUT");

// 快捷方式的名称

shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));

// 不允许重复创建

shortcut.putExtra("duplicate", false);

// 指定当前的Activity为快捷方式启动的对象: 如

com.everest.video.VideoPlayer

// 这里必须为Intent设置一个action,可以任意(但安装和卸载时该参数必须一致)

String action = "com.android.action.test";

Intent respondIntent = new Intent(main.this, main.this

.getClass());

respondIntent.setAction(action);

shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, respondIntent);

sendBroadcast(shortcut);

}

});

delete.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

Intent shortcut = new Intent(

"com.android.launcher.action.UNINSTALL_SHORTCUT"); // 快捷方式的名称

shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,

getString(R.string.app_name));

// 指定当前的Activity为快捷方式启动的对象: 如

com.everest.video.VideoPlayer

// 这里必须为Intent设置一个action,可以任意(但安装和卸载时该参数必须一致)

String action = "com.android.action.test";

Intent respondIntent = new Intent(main.this, main.this

.getClass());

respondIntent.setAction(action);

shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, respondIntent);

sendBroadcast(shortcut);

}

});

}

}

实验八 创建Service

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解Service的常用方法。

2.了解创建和使用Service的方法。

3.掌握Service的生命周期。

【实验内容】

实验题1.练习创建启动模式下运行的Service组件。创建一个Android工程StartModeService,活动名称main.java,创建一个Service类CountService.java。运行后在LogCat窗口观察提示信息。

【参考程序】

main.java

package com.demo.startmodeservice;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

public class main extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

this.startService(new Intent(this, CountService.class)); }

@Override

protected void onDestroy() {

super.onDestroy();

this.stopService(new Intent(this, CountService.class)); }

}

CountService.java

package com.demo.startmodeservice;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.util.Log;

public class CountService extends Service {

private boolean threadDisable;

private int count;

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onCreate() {

super.onCreate();

Log.v("CountService", "oncreate");

}

@Override

public int onStartCommand(Intent intent,int flag,int startid) { Log.v("CountService", "onStartCommand");

new Thread(new Runnable() {

@Override

public void run() {

while (!threadDisable) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

}

count++;

Log.v("CountService", "Count is " + count); }

}

}).start();

return START_NOT_STICKY;

}

@Override

public void onDestroy() {

super.onDestroy();

this.threadDisable = true;

Log.v("CountService", "on destroy");

}

public int getCount() {

return count;

}

}

主配置文件参考书程序7-2。

实验题2.练习多请求下的线程同步。在1题的工程中添加活动main2.java,

添加界面main2.xml,界面上添加两个按钮启动、停止。程序运行后通过按钮实现启动和停止Service。

【参考程序】

main2.java

package com.demo.startmodeservice;

import android.app.Activity;

import android.view.View.OnClickListener;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class main2 extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main2);

Button Button1 = (Button) findViewById(R.id.button1);

Button1.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Intent i=new Intent(main2.this, CountIntentService.class);

Bundle bd=new Bundle();

double a = Math.random()*10;

a = Math.ceil(a);

int randomNum = new Double(a).intValue();

bd.putInt("waitingtime", randomNum);

i.putExtra("attachment", bd);

startService(i);

}

});

Button Button2 = (Button) findViewById(R.id.button2);

Button2.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

stopService(new Intent(main2.this, CountIntentService.class)); }

});

// this.startService(new Intent(this, CountService.class));

}

@Override

protected void onDestroy() {

super.onDestroy();

// this.stopService(new Intent(this, CountService.class));

}

}

main2.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent">

<Button android:text="启动" android:id="@+id/button1" android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

<Button android:text="停止" android:id="@+id/button2" android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

</LinearLayout>

实验题3.练习创建启动模式下运行的Service组件。创建一个Android工程StartModeService,活动名称main2.java,创建一个Service类

CountIntentService.java。运行后在LogCat窗口观察提示信息。

【参考程序】

CountIntentService.java

package com.demo.startmodeservice;

import java.text.SimpleDateFormat;

import android.app.IntentService;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

public class CountIntentService extends IntentService {

int span;

public CountIntentService() {

super("CountIntentService");

// TODO Auto-generated constructor stub

}

@Override

protected void onHandleIntent(Intent arg0) {

// TODO Auto-generated method stub

Log.v("onHandleIntent", "服务启动时间 " +getCurrentTime());

Bundle b=arg0.getBundleExtra("attachment");

span=b.getInt("waitingtime");

long endTime = System.currentTimeMillis() + span*1000;

Log.v("onHandleIntent", "服务持续时间 " +span);

while (System.currentTimeMillis() < endTime) {

synchronized (this) {

try {

wait(endTime - System.currentTimeMillis());

} catch (Exception e) {

}

}

}

}

@Override

public void onDestroy() {

// TODO Auto-generated method stub

Log.v("onDestroy", "服务销毁时间 " +getCurrentTime()); super.onDestroy();

}

public String getCurrentTime(){

SimpleDateFormat tempDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String datetime = tempDate.format(new java.util.Date());

return datetime;

}

}

main2.java

package com.demo.startmodeservice;

import android.app.Activity;

import android.view.View.OnClickListener;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class main2 extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main2);

Button Button1 = (Button) findViewById(R.id.button1);

Button1.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Intent i=new Intent(main2.this, CountIntentService.class); Bundle bd=new Bundle();

double a = Math.random()*10;

a = Math.ceil(a);

int randomNum = new Double(a).intValue();

bd.putInt("waitingtime", randomNum);

i.putExtra("attachment", bd);

startService(i);

}

});

Button Button2 = (Button) findViewById(R.id.button2); Button2.setOnClickListener(new OnClickListener() { public void onClick(View v) {

stopService(new Intent(main2.this,

CountIntentService.class));

}

});

// this.startService(new Intent(this, CountService.class)); }

@Override

protected void onDestroy() {

super.onDestroy();

// this.stopService(new Intent(this, CountService.class)); }

}

实验九 创建IntentService

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解绑定模式下的Service。

2.掌握创建和使用IntentService。

【实验内容】

实验题1.练习绑定模式下的Service创建。创建一个Android工程

BindService,活动名称LocalBind.java,创建一个接口类ICountService.java,一个Service类LocalCountService.java。运行后在LogCat窗口观察提示信息。

【参考程序】

ICountService.java

package com.demo.bindservice;

public interface ICountService {

public abstract int getCount();

}

LocalCountService.java

package com.demo.bindservice;

import android.app.Service;

import android.content.Intent;

import android.os.Binder;

import android.os.IBinder;

import android.util.Log;

public class LocalCountService extends Service {

private boolean threadDisable;

private int count;

private ServiceBinder serviceBinder = new ServiceBinder();

public class ServiceBinder extends Binder implements ICountService { @Override

public int getCount() {

return count;

}

}

@Override

public IBinder onBind(Intent intent) {

Log.v("CountService", "onBind");

return serviceBinder;

}

@Override

public void onCreate() {

super.onCreate();

new Thread(new Runnable() {

@Override

public void run() {

while (!threadDisable) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

}

count++;

Log.v("CountService", "Count is " + count); }

}

}).start();

/**/

Log.v("CountService", "oncreate");

}

@Override

public int onStartCommand(Intent intent, int flag, int startid) { Log.v("CountService", "onStartCommand");

return START_STICKY;

}

@Override

public void onDestroy() {

super.onDestroy();

this.threadDisable = true;

Log.v("CountService", "on destroy");

}

public int getCount() {

return count;

}

}

LocalBind.java

package com.demo.bindservice;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.util.Log;

public class LocalBind extends Activity {

private ServiceConnection serviceConnection = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

LocalcountService = (ICountService) service;

Log.v("CountService", "on serivce connected, count is "

+ LocalcountService.getCount());

}

@Override

public void onServiceDisconnected(ComponentName name) { LocalcountService = null;

}

};

private ICountService LocalcountService;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

this.bindService(new Intent("com.demo.service.LocalCountService"), this.serviceConnection, BIND_AUTO_CREATE);

}

@Override

protected void onDestroy() {

this.unbindService(serviceConnection);

super.onDestroy();

}

}

主配置文件参考书程序7-12。

实验题2.练习远程绑定模式下的Service创建。在1题的工程中,活动名称LocalBind.java,创建一个接口类IMyCountService.aidl,一个Service类

RemoteCountService.java。运行后在LogCat窗口观察提示信息。

【参考程序】

IMyCountService.aidl

package com.demo.bindservice;

interface IMyCountService {

int getCount();

}

RemoteCountService.java

package com.demo.bindservice;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;

import android.util.Log;

public class RemoteCountService extends Service {

private boolean threadDisable;

private int count;

private IMyCountService.Stub serviceBinder = new

IMyCountService.Stub() {

@Override

public int getCount() throws RemoteException {

return count;

}

};

@Override

public IBinder onBind(Intent intent) {

Log.v("RemoteCountService", "onBind");

return serviceBinder;

}

@Override

public void onCreate() {

super.onCreate();

new Thread(new Runnable() {

@Override

public void run() {

while (!threadDisable) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

}

count++;

Log.v("RemoteCountService", "Count is " + count); }

}

}).start();

/**/

Log.v("RemoteCountService", "oncreate");

}

@Override

public int onStartCommand(Intent intent, int flag, int startid) { Log.v("RemoteCountService", "onStartCommand");

return START_STICKY;

}

@Override

public void onDestroy() {

super.onDestroy();

this.threadDisable = true;

Log.v("RemoteCountService", "on destroy");

}

public int getCount() {

return count;

}

}

主配置文件参考书程序7-15.

实验题3.练习传递复杂对象。在1题的工程中,活动名称LocalBind.java,创建一个接口类CountBean.aidl,一个bean类CountBean.java,一个Service类RemoteCountBeanService.java。运行后在LogCat窗口观察提示信息。

【参考程序】

CountBean.java

package com.demo.bindservice;

import android.os.Parcel;

import android.os.Parcelable;

import android.os.Parcelable.Creator;

public class CountBean implements Parcelable {

public static final Parcelable.Creator<CountBean> CREATOR = new Creator<CountBean>() {

@Override

public CountBean createFromParcel(Parcel source) {

CountBean bean = new CountBean();

bean.count = source.readInt();

return bean;

}

@Override

public CountBean[] newArray(int size) {

return new CountBean[size];

}

};

public CountBean() {

}

public int getCount() {

return count;

}

public void setCount(int count) {

this.count = count;

}

public int count;

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeInt(this.count);

}

@Override

public int describeContents() {

return 0;

}

}

RemoteCountBeanService.java

package com.demo.bindservice;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;

import android.util.Log;

public class RemoteCountBeanService extends Service {

private boolean threadDisable;

private int count;

private IMyCountBeanService.Stub serviceBinder = new IMyCountBeanService.Stub() {

@Override

public CountBean getCount() throws RemoteException { CountBean cn=new CountBean();

cn.setCount(count);//用当前服务中的值为CountBean赋值 return cn;

}

};

@Override

public IBinder onBind(Intent intent) {

Log.v("CountBeanService", "onBind");

return serviceBinder;

}

@Override

public void onCreate() {

super.onCreate();

new Thread(new Runnable() {

@Override

public void run() {

while (!threadDisable) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

}

count++;

Log.v("CountBeanService", "Count is " + count); }

}

}).start();

/**/

Log.v("CountBeanService", "oncreate");

}

@Override

public int onStartCommand(Intent intent,int flag,int startid) { Log.v("CountBeanService", "onStartCommand");

return START_STICKY;

}

@Override

public void onDestroy() {

super.onDestroy();

this.threadDisable = true;

Log.v("CountBeanService", "on destroy");

}

}

参考书程序7-19,7-21.

实验十 内置Content Provider

【实验类型】设计性

【实验要求】必做

【实验目的】

1.了解内置Content Provider的实现。

2.了解通讯录读取的方法。

【实验内容】

实验题1.模拟访问手机通讯录的功能。创建一个Android工程

DataShareDemo,活动名称main.java。运行后在LogCat窗口观察提示信息。

【参考程序】

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="/apk/res/android" package="com.demo.datashare"

android:versionCode="1"

android:versionName="1.0">

<application android:icon="@drawable/icon"

android:label="@string/app_name">

<activity android:name=".main"

android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" /> <category

android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

<uses-sdk android:minSdkVersion="7" />

<uses-permission android:name="android.permission.READ_CONTACTS" /> </manifest>

main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="/apk/res/android" android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<TextView

android:id="@+id/tv"

android:layout_width="fill_parent"

android:layout_height="wrap_content" android:text="@string/hello"

/>

</LinearLayout>

main.java参考书程序9-1.

实验十一 自定义Content Provider

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解数据操作原理。

2.了解数据模型。

3.掌握使用自定义Content Provider进行数据读写操作的方法。

【实验内容】

实验题1.练习创建Content Provider的步骤。创建一个Android工程ContentProviderDemo,活动名称main.java,创建一个Content Provider类TestContentProvider.java。运行后在LogCat窗口观察提示信息。

【参考程序】

TestContentProvider.java

package com.demo.provider;

import java.util.HashMap;

import

com.demo.provider.TestContentProviderMetaData.BookTableMetaData; import android.content.ContentProvider;

import android.content.ContentResolver;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.Context;

import android.content.UriMatcher;

import android.database.Cursor;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.database.sqlite.SQLiteQueryBuilder;

import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.net.Uri;

import android.provider.BaseColumns;

import android.text.TextUtils;

import android.util.Log;

public class TestContentProvider extends ContentProvider {

public static final String TAG = "TestContentProvider";

public DatabaseHelper openHelper = null;

//-- 创建表列名与JavaBean 映射.

public static HashMap<String, String> sBookProjectionMap = null;

static{

sBookProjectionMap = new HashMap<String, String >();

sBookProjectionMap.put(BookTableMetaData._ID,

BookTableMetaData._ID);

sBookProjectionMap.put(BookTableMetaData.BOOK_NAME,

BookTableMetaData.BOOK_NAME);

sBookProjectionMap.put(BookTableMetaData.BOOK_ISBN,

BookTableMetaData.BOOK_ISBN);

sBookProjectionMap.put(BookTableMetaData.BOOK_AUTHOR,

BookTableMetaData.BOOK_AUTHOR);

sBookProjectionMap.put(BookTableMetaData.CREATED_DATE, BookTableMetaData.CREATED_DATE);

sBookProjectionMap.put(BookTableMetaData.MODIFIED_DATE, BookTableMetaData.MODIFIED_DATE);

}

//-- 创建URI最佳匹配器

private static UriMatcher sUriMatcher = null;

//-- 注册URI请求类型

private static final int

INCOMMING_BOOK_COLLECTION_URI_INDICATOR = 1;

private static final int INCOMMING_SINGLE_BOOK_URI_INDICATOR = 2; static{

sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

sUriMatcher.addURI(TestContentProviderMetaData.AUTHORITY, "books", INCOMMING_BOOK_COLLECTION_URI_INDICATOR);

sUriMatcher.addURI(TestContentProviderMetaData.AUTHORITY, "books/#", INCOMMING_SINGLE_BOOK_URI_INDICATOR);

}

@Override

public int delete(Uri uri, String whereClause, String[] whereArgs) { Log.i(TAG, "del");

// TODO Auto-generated method stub

SQLiteDatabase db = openHelper.getWritableDatabase();

int count = 0;

switch(sUriMatcher.match(uri)){

case INCOMMING_BOOK_COLLECTION_URI_INDICATOR: count = db.delete(BookTableMetaData.TABLE_NAME,

whereClause, whereArgs);

break;

case INCOMMING_SINGLE_BOOK_URI_INDICATOR:

String rowID = uri.getPathSegments().get(1);

String where = BookTableMetaData._ID + "=" + rowID +

(!TextUtils.isEmpty(whereClause)?" AND (" + whereClause + ')':"");

count = db.delete(BookTableMetaData.TABLE_NAME, where,

whereArgs);

break;

default:

throw new IllegalArgumentException("Unknown URI " + uri); }

this.getContext().getContentResolver().notifyChange(uri, null); return count;

}

@Override

public String getType(Uri uri) {

switch(sUriMatcher.match(uri)){

case INCOMMING_BOOK_COLLECTION_URI_INDICATOR: return BookTableMetaData.CONTENT_TYPE;

case INCOMMING_SINGLE_BOOK_URI_INDICATOR:

return BookTableMetaData.CONTENT_ITEM_TYPE;

default:

throw new IllegalArgumentException("Unknown URI " + uri); }

}

@Override

public Uri insert(Uri uri, ContentValues values) {

// TODO Auto-generated method stub

Log.i(TAG, "insert");

long now = Long.valueOf(System.currentTimeMillis()); if(values.containsKey(BookTableMetaData.CREATED_DATE) ==

false){

values.put(BookTableMetaData.CREATED_DATE, now);

}

if(values.containsKey(BookTableMetaData.MODIFIED_DATE) ==

false){

values.put(BookTableMetaData.MODIFIED_DATE, now);

}

if(values.containsKey(BookTableMetaData.BOOK_NAME) == false){ //values.put(BookTableMetaData.BOOK_NAME, "null");

throw new SQLException("Failed to insert row ,because Book

Name is needed " + uri);

}

if(values.containsKey(BookTableMetaData.BOOK_ISBN) == false){ values.put(BookTableMetaData.BOOK_ISBN, "Unknown ISBN"); }

if(values.containsKey(BookTableMetaData.BOOK_AUTHOR) ==

false){

values.put(BookTableMetaData.BOOK_AUTHOR, "Unknown

author");

}

SQLiteDatabase db = openHelper.getWritableDatabase();

long rowID = db.insert(BookTableMetaData.TABLE_NAME,

BookTableMetaData.BOOK_NAME, values);

if(rowID > 0){

Uri insertBookedUri =

ContentUris.withAppendedId(BookTableMetaData.CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(insertBookedUri, null);

return insertBookedUri;

}

throw new SQLException("Failed to insert row into " + uri);

}

@Override

public boolean onCreate() {

// TODO Auto-generated method stub

Log.i(TAG, "create table");

openHelper = new DatabaseHelper(this.getContext());

Log.i(TAG, openHelper.toString());

return true;

}

@Override

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

// TODO Auto-generated method stub

Log.i(TAG, "query");

Cursor cursor = null;

SQLiteQueryBuilder qb = null;

qb = new SQLiteQueryBuilder();

switch(sUriMatcher.match(uri)){

case INCOMMING_BOOK_COLLECTION_URI_INDICATOR:

qb.setTables(BookTableMetaData.TABLE_NAME);

qb.setProjectionMap(sBookProjectionMap);

break;

case INCOMMING_SINGLE_BOOK_URI_INDICATOR:

qb.setTables(BookTableMetaData.TABLE_NAME);

qb.setProjectionMap(sBookProjectionMap);

qb.appendWhere(BookTableMetaData._ID + "=" +

uri.getPathSegments().get(1));

break;

default:

throw new IllegalArgumentException("Unknown URI " + uri);

}

String orderBy = "";

if(TextUtils.isEmpty(sortOrder)){

orderBy = BookTableMetaData.DEFAULT_SORT_ORDER; }else{

orderBy = sortOrder;

}

SQLiteDatabase db = openHelper.getReadableDatabase();

Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);

int i = c.getCount();

ContentResolver cr = this.getContext().getContentResolver(); c.setNotificationUri(cr, uri);

return c;

}

@Override

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {

// TODO Auto-generated method stub

Log.i(TAG, "update");

SQLiteDatabase db = openHelper.getWritableDatabase(); int count = 0;

switch(sUriMatcher.match(uri)){

case INCOMMING_BOOK_COLLECTION_URI_INDICATOR: count = db.update(BookTableMetaData.TABLE_NAME, values, selection, selectionArgs);

break;

case INCOMMING_SINGLE_BOOK_URI_INDICATOR:

String rowID = uri.getPathSegments().get(1);

String where = "BookTableMetaData._ID" + "=" + rowID + (!TextUtils.isEmpty(selection)?" AND(" + selection + ')':"");

count = db.update(BookTableMetaData.TABLE_NAME, values, where, selectionArgs);

break;

default:

throw new IllegalArgumentException("Unknown URI " + uri); }

getContext().getContentResolver().notifyChange(uri, null); return count;

}

//-- create table

public class DatabaseHelper extends SQLiteOpenHelper{

public DatabaseHelper(Context context) {

super(context,

TestContentProviderMetaData.DATABASE_NAME, null,

TestContentProviderMetaData.DATABASE_VERSION);

}

@Override

public void onCreate(SQLiteDatabase db) {

// TODO Auto-generated method stub

String sql = "CREATE TABLE " +

BookTableMetaData.TABLE_NAME

+ " (" +

TestContentProviderMetaData.BookTableMetaData._ID

+ " INTEGER PRIMARY KEY,"

+ BookTableMetaData.BOOK_NAME + " TEXT," + BookTableMetaData.BOOK_ISBN + " TEXT,"

+ BookTableMetaData.BOOK_AUTHOR + " TEXT," + BookTableMetaData.CREATED_DATE + "

INTEGER,"

+ BookTableMetaData.MODIFIED_DATE + "

INTEGER"

+ ");";

Log.i(TAG, db.getPath());

db.execSQL(sql);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int

newVersion) {

// TODO Auto-generated method stub

Log.i(TAG, "Upgrade database from " + oldVersion + " to " + newVersion + ", which will destroy old data!");

String sql = "DROP TABLE IF EXISTS " +

BookTableMetaData.TABLE_NAME;

db.execSQL(sql);

onCreate(db);

}

}

}

class TestContentProviderMetaData {

public static final String DATABASE_NAME = "books.db";

public static final int DATABASE_VERSION = 1;

public static final String AUTHORITY =

"com.demo.provider.bookprovider";

public static final String BOOKS_TABLE_NAME = "books";

public static final class BookTableMetaData implements

BaseColumns{

public static final String TABLE_NAME = "books";

// String

public static final String BOOK_NAME = "name";

// String

public static final String BOOK_ISBN = "isbn";

// String

public static final String BOOK_AUTHOR = "author"; // Integer

public static final String CREATED_DATE = "created"; // Integer

public static final String MODIFIED_DATE = "modified";

public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/books");

public static final Uri CONTENT_SINGLE_URI =

Uri.parse("content://" + AUTHORITY + "/books/#");

//-- 多记录

public static final String CONTENT_TYPE =

"vnd.android.cursor.dir/vnd.androidbook.book";

//-- 单记录

public static final String CONTENT_ITEM_TYPE =

"vnd.android.cursor.item/vnd.androidbook.book";

public static final String DEFAULT_SORT_ORDER = "modified DESC";

}

}

参考书程序9-3,9-4.

实验十二 简单ui组件

【实验类型】验证性

【实验要求】必做

【实验目的】

1.掌握TextView,EditText,Button,RadioButton,Progressbar,CheckBox,SeekBar,RatingBar的使用方法。

【实验内容】

实验题1.练习TextView组件的使用方法。创建一个Android工程

simplewidget,活动名称main.java,创建一个活动TextViewDemo.java。

【参考程序】

TextViewDemo.java

package com.simplewidget.demo;

import android.app.Activity;

import android.content.res.Resources;

import android.graphics.drawable.Drawable;

import android.os.Bundle;

import android.text.Html;

import android.widget.TextView;

public class TextViewDemo extends Activity

{

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.textview);

TextView textView = (TextView) findViewById(R.id.textview2); // textView.setText("代码中动态赋值的文本");

textView.setText(Html.fromHtml("Hello <b>Android</b>,<font size=\"3\" color=\"red\">I am studying…</font>"));

textView.setTextColor(android.graphics.Color.RED);

Resources resources=getBaseContext().getResources();

Drawable drawable=resources.getDrawable(R.color.background); textView.setBackgroundDrawable(drawable);

}

}

界面文件参考书程序11-1.

实验题2.练习EditText组件的使用方法。创建一个Android工程

simplewidget,活动名称main.java,创建一个活动EditTextDemo.java。

【参考程序】

package com.simplewidget.demo;

import android.app.Activity;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.view.KeyEvent;

import android.view.inputmethod.EditorInfo;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.TextView.OnEditorActionListener;

public class edittextDemo extends Activity

{

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.edittext);

}

}

界面文件参考书程序11-5.

实验题3.练习Button组件的使用方法。创建一个Android工程simplewidget,活动名称main.java,创建一个活动ButtonDemo.java。

【参考程序】

package com.simplewidget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ImageButton;

import android.widget.TextView;

public class ButtonDemo extends Activity {

TextView tv =null;

String promote="你喜欢的手机品牌是?";

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.button);

tv = (TextView) findViewById(R.id.TextView01);

/*Button button1 = (Button) findViewById(R.id.Button01);

button1.setOnClickListener(this);

Button button2= (Button) findViewById(R.id.Button02);

button2.setOnClickListener(this);

Button button3 = (Button) findViewById(R.id.Button03);

button3.setOnClickListener(this);

button1.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Button b = (Button)v;

tv.setText(promote+b.getText().toString());

}

});

Button button2 = (Button) findViewById(R.id.Button02);

button2.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Button b = (Button)v;

tv.setText(promote+b.getText().toString());

}

});

Button button3 = (Button) findViewById(R.id.Button03);

button3.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Button b = (Button)v;

tv.setText(promote+b.getText().toString());

}

});*/

ImageButton button4 = (ImageButton)

findViewById(R.id.ImageButton);

button4.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

tv.setText(promote+" 暂时保密吆"); }

});

}

public void onClick(View v) {

// TODO Auto-generated method stub

Button b = (Button)v;

if(b.getText()!=null)

tv.setText(promote+b.getText().toString());

}

}

界面文件参考书程序11-7,11-10.

实验题4.练习RadioButton组件的使用方法。创建一个Android工程

simplewidget,活动名称main.java,创建一个活动RadioButtonDemo.java。

【参考程序】

package com.simplewidget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.widget.RadioButton;

import android.widget.RadioGroup;

import android.widget.RadioGroup.OnCheckedChangeListener;

import android.widget.TextView;

public class RadioDemo extends Activity {

private TextView myTextView;

private TextView myTextView2;

private RadioButton Btn1;

private RadioButton Btn2;

private RadioButton Btn3;

private RadioButton Btns1;

private RadioButton Btns2;

private RadioButton Btns3;

private RadioGroup service;

private RadioGroup device;

/** Called when the activity is first created. */

@Override public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.radio);

//通过ID找到TextView

myTextView = (TextView) findViewById(R.id.myTextView);

myTextView2 = (TextView) findViewById(R.id.myTextView2);

//通过ID找到RadioButton

Btn1 = (RadioButton) findViewById(R.id.moto);

Btn2 = (RadioButton) findViewById(R.id.samsung);

Btn3 = (RadioButton) findViewById(R.id.htc);

//通过ID找到RadioGroup

device = (RadioGroup) findViewById(R.id.rBtnGroup_mobile);

//只要对RadioGroup进行监听

device.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(RadioGroup group, int

checkedId) {

// TODO Auto-generated method stub

if(R.id.moto == checkedId){

myTextView.setText("您选择的设备是:" +

Btn1.getText().toString()); }

else if(R.id.samsung == checkedId){

myTextView.setText("您选择的设备是:" +

Btn2.getText().toString()); }

else if(R.id.htc == checkedId){

myTextView.setText("您选择的设备是:" +

Btn3.getText().toString()); }

} });

//通过ID找到RadioButton

Btns1 = (RadioButton) findViewById(R.id.tele);

Btns2 = (RadioButton) findViewById(R.id.mbile);

Btns3 = (RadioButton) findViewById(R.id.unicomm);

//通过ID找到RadioGroup

service = (RadioGroup) findViewById(R.id.rBtnGroup_service); //只要对RadioGroup进行监听

service.setOnCheckedChangeListener(new OnCheckedChangeListener() {

public void onCheckedChanged(RadioGroup group, int

checkedId) {

// TODO Auto-generated method stub

if(R.id.tele == checkedId){

myTextView2.setText("您选择的运行商是:" +

Btns1.getText().toString()); }

else if(R.id.mbile == checkedId){

myTextView2.setText("您选择的运行商是:" +

Btns2.getText().toString()); }

else if(R.id.unicomm == checkedId){

myTextView2.setText("您选择的运行商是:" +

Btns3.getText().toString()); }

} });

}

}

界面文件参考书程序11-18.

实验题5.练习Progressbar组件的使用方法。创建一个Android工程

simplewidget,活动名称main.java,创建一个活动ProgressbarDemo.java。

【参考程序】

package com.simplewidget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.view.Window;

public class ProgressBarDemo extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 设置窗口进度条特性风格

requestWindowFeature(Window.FEATURE_PROGRESS);

// 请求窗口特色风格,这里设置成不明确的进度风格

//

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.progress);

// 设置进度条可见性

setProgressBarVisibility(true);

// setProgressBarIndeterminateVisibility(true);

// 设置标题栏中的不明确的进度条是否可以显示

// 设置进度条进度值,要乘以100的

setProgress(60 * 100);

setSecondaryProgress(80 * 100);

}

}

界面文件参考书程序11-20.

实验题6.练习CheckBox组件的使用方法。创建一个Android工程

simplewidget,活动名称main.java,创建一个活动CheckBoxDemo.java。

【参考程序】

package com.simplewidget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.widget.CheckBox;

import android.widget.CompoundButton;

import android.widget.TextView;

public class CheckBoxDemo extends Activity {

private TextView tv;

private CheckBox cb1;

private CheckBox cb2;

private CheckBox cb3;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.checkbox);

tv = (TextView)findViewById(R.id.textview1);

cb1 = (CheckBox)findViewById(R.id.checkbox1);

cb2 = (CheckBox)findViewById(R.id.checkbox2);

cb3 = (CheckBox)findViewById(R.id.checkbox3);

cb1.setOnCheckedChangeListener(cbListener);

cb2.setOnCheckedChangeListener(cbListener);

cb3.setOnCheckedChangeListener(cbListener);

}

private CheckBox.OnCheckedChangeListener cbListener =

new CheckBox.OnCheckedChangeListener(){

public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)

{

String stv = getString(R.string.mobileos);

String scb1 = getString(R.string.ios);

String scb2 = getString(R.string.android);

String scb3 = getString(R.string.wphone);

String temp=stv;

if(cb1.isChecked()== true )temp+=scb1;

if(cb2.isChecked()== true )temp+=" "+scb2;

if(cb3.isChecked()== true )temp+=" "+scb3;

tv.setText(temp);

}

};

}

界面文件参考书程序11-25.

实验题7.练习SeekBar组件的使用方法。创建一个Android工程

simplewidget,活动名称main.java,创建一个活动SeekBarDemo.java。

【参考程序】

package com.simplewidget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.widget.SeekBar;

import android.widget.SeekBar.OnSeekBarChangeListener;

import android.widget.TextView;

import android.widget.Toast;

public class SeekDemo extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.seekbar);

//找到拖动条和文本框

final SeekBar sb = (SeekBar) findViewById(R.id.SeekBar01);

final TextView tv1 = (TextView) findViewById(R.id.TextView01); //设置拖动条的初始值和文本框的初始值

sb.setMax(100);

sb.setProgress(30);

tv1.setText("当前进度:" + sb.getProgress());

//设置拖动条改变监听器

OnSeekBarChangeListener osbcl = new OnSeekBarChangeListener()

{

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

tv1.setText("当前进度:" + sb.getProgress());

Toast.makeText(getApplicationContext(),

"onProgressChanged",

Toast.LENGTH_SHORT).show();

}

public void onStartTrackingTouch(SeekBar seekBar) {

Toast.makeText(getApplicationContext(),

"onStartTrackingTouch",

Toast.LENGTH_SHORT).show();

}

public void onStopTrackingTouch(SeekBar seekBar) {

Toast.makeText(getApplicationContext(),

"onStopTrackingTouch",

Toast.LENGTH_SHORT).show();

}

};

//为拖动条绑定监听器

sb.setOnSeekBarChangeListener(osbcl);

}

}

界面文件参考书程序11-27.

实验题8.练习RatingBar组件的使用方法。创建一个Android工程

simplewidget,活动名称main.java,创建一个活动RatingBarDemo.java。

【参考程序】

package com.simplewidget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.widget.RatingBar;

import android.widget.RatingBar.OnRatingBarChangeListener;

public class RatingBarDemo extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.ratingbar);

final RatingBar rb1 = (RatingBar) findViewById(R.id.ratingBar1); final RatingBar rb2 = (RatingBar) findViewById(R.id.ratingBar2); final RatingBar rb3 = (RatingBar) findViewById(R.id.ratingBar3); OnRatingBarChangeListener orbcl = new

OnRatingBarChangeListener() {

public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {

switch (ratingBar.getId()) {

case R.id.ratingBar1:

// 把第一个评分条的值取出来设置给其他评分条 rb2.setRating(rb1.getRating());

rb3.setRating(rb1.getRating() * 2);// 十颗星所以乘以2 break;

case R.id.ratingBar2:

rb1.setRating(rb2.getRating());

rb3.setRating(rb2.getRating() * 2);

break;

case R.id.ratingBar3:

rb1.setRating(rb3.getRating() / 2);

rb2.setRating(rb3.getRating() / 2);

break;

}

}

};

// 绑定监听器

rb1.setOnRatingBarChangeListener(orbcl);

rb2.setOnRatingBarChangeListener(orbcl);

rb3.setOnRatingBarChangeListener(orbcl);

}

}

界面文件参考书程序11-29.

实验十三 中级ui组件

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解Chronometer,ZoomButton,CalendarView,Spinner,ListView的使用方法。

【实验内容】

实验题1.练习Chronometer组件的使用方法。创建一个Android工程

higherwidget,活动名称main.java。

【参考程序】

package com.demo.widget;

import java.text.SimpleDateFormat;

import java.util.Date;

import android.app.Activity;

import android.os.Bundle;

import android.os.SystemClock;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Chronometer;

import android.widget.TextView;

import android.widget.Chronometer.OnChronometerTickListener;

public class main extends Activity implements OnClickListener,

OnChronometerTickListener

{

private Chronometer chronometer;

private TextView tvTime;

@Override

public void onClick(View view)

{

switch (view.getId())

{

case R.id.btnStart:

chronometer.start();

break;

case R.id.btnStop:

chronometer.stop();

break;

case R.id.btnReset:

chronometer.setBase(SystemClock.elapsedRealtime()); break;

case R.id.btnformat:

chronometer.setFormat("Current Time %s");

break;

}

}

@Override

public void onChronometerTick(Chronometer chronometer)//每秒钟都会调用一次

{

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); tvTime.setText("当前时间:" + sdf.format(new Date())); }

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

tvTime = (TextView)findViewById(R.id.tvTime);

Button btnStart = (Button) findViewById(R.id.btnStart);

Button btnStop = (Button) findViewById(R.id.btnStop);

Button btnReset = (Button) findViewById(R.id.btnReset);

Button btnFormat= (Button) findViewById(R.id.btnformat);

chronometer = (Chronometer) findViewById(R.id.chronometer); btnStart.setOnClickListener(this);

btnStop.setOnClickListener(this);

btnReset.setOnClickListener(this);

btnFormat.setOnClickListener(this);

chronometer.setOnChronometerTickListener(this);

chronometer.setFormat("秒表:%s");

}

}

界面文件参考书程序11-31.

实验题2.练习ZoomButton组件的使用方法。创建一个Android工程

higherwidget,活动名称main.java,创建一个活动ZoomButtonDemo.java。

【参考程序】

package com.simplewidget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.TextView;

import android.widget.ZoomButton;

public class ZoomButtonDemo extends Activity {

private ZoomButton zb;

private TextView text;

static long size = 12;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.zoombutton);

zb = (ZoomButton) findViewById(R.id.zoombutton);

text = (TextView) findViewById(R.id.text);

zb.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

size = size + 2;

text.setTextSize(size); }

});

}

}

界面文件参考书程序11-33.

实验题3.练习CalendarView组件的使用方法。创建一个Android工程

higherwidget,活动名称main.java,创建一个活动CalendarViewDemo.java。

【参考程序】

package com.simplewidget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.widget.CalendarView;

import android.widget.CalendarView.OnDateChangeListener;

import android.widget.Toast;

public class CalandarViewDemo extends Activity {

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.calendarview);

CalendarView cv=(CalendarView)

findViewById(R.id.widgetCalendarView1);

cv.setOnDateChangeListener(new OnDateChangeListener(){

public void onSelectedDayChange(CalendarView view, int year, int month, int day) {

// TODO Auto-generated method stub

String s="您选择了" +Integer.toString(year)+"年

"+Integer.toString(year)+"月"+Integer.toString(year)+"日";

Toast.makeText(getApplicationContext(), "",

Toast.LENGTH_LONG).show();

}

}

);

}

}

界面文件参考书程序11-35.

实验题4.练习Spinner组件的使用方法。创建一个Android工程higherwidget,活动名称main.java,创建一个活动SpinnerDemo.java。

【参考程序】

package com.widget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.Spinner;

import android.widget.TextView;

public class SpinnerDemo extends Activity {

private static final String[] m_bloods={"o型","A型","B型","AB型","其他"}; private TextView m_txtView;

private Spinner m_Spinner;

private ArrayAdapter<String> adapter;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.spinner);

m_txtView=(TextView)this.findViewById(R.id.TextView01);

m_Spinner=(Spinner)this.findViewById(R.id.Spinner01);

//将可选内容与ArrayAdapter连接起来

adapter=new

ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,m_bloods); //设置下拉列表的风格

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

//将adapter 添加到m_Spinner中

m_Spinner.setAdapter(adapter);

//添加事件Spinner事件监听

m_Spinner.setOnItemSelectedListener(m_SpinnerListener); //设置默认值

m_Spinner.setVisibility(View.VISIBLE);

}

private Spinner.OnItemSelectedListener m_SpinnerListener=new Spinner.OnItemSelectedListener()

{

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,

long arg3) {

// TODO Auto-generated method stub

m_txtView.setText("你的血型是:"+m_bloods[arg2]);

//arg0.setVisibility(View.VISIBLE);

}

public void onNothingSelected(AdapterView<?> arg0) {

// TODO Auto-generated method stub

}

};

}

界面文件参考书程序12-1.

实验题5.练习ListView组件的使用方法。创建一个Android工程

higherwidget,活动名称main.java,创建一个活动ListViewDemo.java来实现普通列表;创建一个活动MyListActivity.java来实现便捷列表;创建一个活动ListViewDemo2.java来实现列表从数据库读取数据。

【参考程序】

ListViewDemo.java

package com.widget.demo;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.widget.ArrayAdapter;

import android.widget.ListView;

public class ListViewDemo extends Activity {

private ListView listView;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

listView = new ListView(this);

listView.setAdapter(new ArrayAdapter<String>(this,

android.R.layout.simple_expandable_list_item_1, getData())); setContentView(listView);

}

private List<String> getData() {

List<String> data = new ArrayList<String>();

data.add("项目1");

data.add("项目2");

data.add("项目3");

data.add("项目4");

return data;

}

}

MyListActivity.java

package com.widget.demo;

import java.util.ArrayList;

import java.util.List;

import android.app.ListActivity;

import android.os.Bundle;

import android.widget.ArrayAdapter;

import android.widget.ListView;

public class MyListActivity extends ListActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setListAdapter(new ArrayAdapter<String>(this,

android.R.layout.simple_expandable_list_item_1, getData())); this.getListView().setTextFilterEnabled(true);

this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); }

private List<String> getData() {

List<String> data = new ArrayList<String>();

data.add("asdd");

data.add("bcdddd");

data.add("zzzzzz");

data.add("qqqqq");

return data;

}

}

ListViewDemo2.java

package com.widget.demo;

import android.app.Activity;

import android.database.Cursor;

import android.os.Bundle;

import android.provider.ContactsContract;

import android.widget.ListAdapter;

import android.widget.ListView;

import android.widget.SimpleCursorAdapter;

public class ListViewDemo2 extends Activity {

private ListView listView;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

listView = new ListView(this);

Cursor cursor = getContentResolver().query(

ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

startManagingCursor(cursor);

SimpleCursorAdapter listAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1, cursor,

new String[] { ContactsContract.Contacts.DISPLAY_NAME }, new int[] { android.R.id.text1 });

listView.setAdapter(listAdapter);

setContentView(listView);

}

}

实验十四 高级ui组件

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解GridView,Gallery,SlidingDrawer,AutoCompleteTextView,TabHost的使用方法。

【实验内容】

实验题1.练习GridView组件的使用方法。创建一个Android工程

seniorwidget,活动名称main.java,创建一个活动GridViewDemo.java。

【参考程序】

package com.widget.demo;

import java.util.ArrayList;

import java.util.HashMap;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.GridView;

import android.widget.SimpleAdapter;

public class SimpleGridDemo extends Activity {

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.simplegrid);

GridView gridview = (GridView) findViewById(R.id.gridview);

// 生成动态数组,并且转入数据

ArrayList<HashMap<String, Object>> lstImageItem = new

ArrayList<HashMap<String, Object>>();

for (int i = 0; i < 10; i++) {

HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemImage", R.drawable.icon);// 添加图像资源的ID map.put("ItemText", "应用" + String.valueOf(i));// 按序号做

ItemText

lstImageItem.add(map);

}

// 生成适配器的ImageItem <====> 动态数组的元素,两者一一对应 SimpleAdapter saImageItems = new SimpleAdapter(this,

lstImageItem,// 数据来源

R.layout.simplegriditem,// night_item的XML实现

// 动态数组与ImageItem对应的子项

new String[] { "ItemImage", "ItemText" },

// ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] { R.id.ItemImage, R.id.ItemText });

// 添加并且显示

gridview.setAdapter(saImageItems);

// 添加消息处理

gridview.setOnItemClickListener(new ItemClickListener());

}

// 当AdapterView被单击(触摸屏或者键盘),则返回的Item单击事件 class ItemClickListener implements OnItemClickListener {

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

HashMap<String, Object> item = (HashMap<String, Object>) arg0 .getItemAtPosition(arg2);

setTitle((String) item.get("ItemText"));

}

}

}

界面文件参考书程序12-11.

实验题2.练习Gallery组件的使用方法。创建一个Android工程seniorwidget,活动名称main.java,创建一个活动GalleryDemo.java。

【参考程序】

package com.widget.demo;

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.BaseAdapter;

import android.widget.Gallery;

import android.widget.ImageView;

public class GralleryDemo extends Activity {

/** Called when the activity is first created. */

private Gallery gallery;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.grallery);

//初始化Gallery。

gallery=(Gallery)findViewById(R.id.gallery);

try {

//设置Gallery的Adapter。

gallery.setAdapter(new ImageAdapter(GralleryDemo.this)); } catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//点击事件。

gallery.setOnItemClickListener(new OnItemClickListener(){

public void onItemClick(AdapterView<?> arg0, View arg1, int itemid, long arg3) {

// TODO Auto-generated method stub

setTitle("您点击了第"+String.valueOf(itemid+1)+"项"); }

});

}

class ImageAdapter extends BaseAdapter {

//定义Context,即Activity

private Context context;

//定义整型数组 即图片源。

private Integer image[]={R.drawable.android,R.drawable.monkey, R.drawable.panda,R.drawable.pig, R.drawable.niu,R.drawable.tiger}; public ImageAdapter(Context c) throws

IllegalArgumentException, IllegalAccessException{

context=c;

}

public int getCount() {

// TODO Auto-generated method stub

//获取图片个数。

return Integer.MAX_VALUE;

//return image.length;

}

public Object getItem(int position) {

// TODO Auto-generated method stub

//获取图片在库中的位置。

return position;

}

public long getItemId(int position) {

// TODO Auto-generated method stub

//获取图片在库中的位置。

return position;

}

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

ImageView imageview=new ImageView(context);

//给imageView设置图片资源。

imageview.setImageResource(image[position%image.length]); //imageview.setImageResource(image[position]);

//设置比例类型。

imageview.setScaleType(ImageView.ScaleType.FIT_XY);

//设置图片布局和显示大小。

imageview.setLayoutParams(new

Gallery.LayoutParams(100,100));

//设置图片之间的距离。

imageview.setPadding(15,0,15,0);

return imageview;

}

}

}

界面文件参考书程序12-13.

实验题3.练习SlidingDrawer组件的使用方法。创建一个Android工程

seniorwidget,活动名称main.java,创建一个活动SlidingDrawerDemo.java。

【参考程序】

package com.widget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.widget.ImageButton;

import android.widget.SlidingDrawer;

import android.widget.TextView;

public class SlidingDrawerDemo extends Activity {

private SlidingDrawer mDrawer;

private ImageButton imbg;

private TextView tv;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.slidingdrawer);

imbg=(ImageButton)findViewById(R.id.handle);

mDrawer=(SlidingDrawer)findViewById(R.id.slidingdrawer);

tv=(TextView)findViewById(R.id.tv);

mDrawer.setOnDrawerOpenListener(new

SlidingDrawer.OnDrawerOpenListener()

{

public void onDrawerOpened() {

imbg.setImageResource(R.drawable.close);

}

});

mDrawer.setOnDrawerCloseListener(new

SlidingDrawer.OnDrawerCloseListener(){

public void onDrawerClosed() {

imbg.setImageResource(R.drawable.open);

}

});

mDrawer.setOnDrawerScrollListener(new

SlidingDrawer.OnDrawerScrollListener(){

public void onScrollEnded() {

}

public void onScrollStarted() {

}

});

}

}

界面文件参考书程序12-16.

实验题4.练习AutoCompleteTextView组件的使用方法。创建一个Android工程seniorwidget,活动名称main.java,创建一个活动

AutoCompleteTextViewDemo.java。

【参考程序】

package com.widget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.widget.ArrayAdapter;

import android.widget.AutoCompleteTextView;

import android.widget.MultiAutoCompleteTextView;

import android.widget.TextView;

public class AutoCompleteDemo extends Activity {

/** Called when the activity is first created. */

private static final String[] nContent = { "zhuo", "kobe", "zhuori", "kobebryant", "ko8e", "ko8ebryant" };

private AutoCompleteTextView autoView = null;

private MultiAutoCompleteTextView autoView2 = null;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.autocomplete);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, nContent); autoView = (AutoCompleteTextView) findViewById(R.id.autoView); // 将adapter添加到AutoCompleteTextView中

autoView.setAdapter(adapter);

autoView.setThreshold(4);

//多行处理

autoView2 = (MultiAutoCompleteTextView)

findViewById(R.id.autoView2);

autoView2.setTokenizer(new

MultiAutoCompleteTextView.CommaTokenizer());

autoView2.setAdapter(adapter);

autoView2.setThreshold(4);

}

}

界面文件参考书程序12-18.

实验题5.练习TabHost组件的使用方法。创建一个Android工程

seniorwidget,活动名称main.java,创建一个活动TabHostDemo1.java实现分页视图的便捷实现;创建一个活动TabHostDemo2.java实现分页视图的普通实现。

【参考程序】

TabHostDemo1.java

package com.widget.demo;

import android.app.AlertDialog;

import android.app.Dialog;

import android.app.TabActivity;

import android.content.DialogInterface;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.widget.TabHost;

public class tabHostDemo1 extends TabActivity {

/** Called when the activity is first created. */

private TabHost tabHost;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// setContentView(R.layout.main);

tabHost = this.getTabHost();

LayoutInflater li = LayoutInflater.from(this);

li.inflate(R.layout.tabhost1, tabHost.getTabContentView(), true);

tabHost.addTab(tabHost.newTabSpec("Tab_1").setContent(R.id.tab1) .setIndicator("TAB1",

this.getResources().getDrawable(R.drawable.android)));

tabHost.addTab(tabHost.newTabSpec("Tab_2").setContent(R.id.tab2) .setIndicator("TAB2",

this.getResources().getDrawable(R.drawable.monkey)));

tabHost.addTab(tabHost.newTabSpec("Tab_3").setContent(R.id.tab3) .setIndicator("TAB3",

this.getResources().getDrawable(R.drawable.panda)));

tabHost.setCurrentTab(1);

// tabHost.setBackgroundColor(Color.GRAY);

tabHost.setOnTabChangedListener(new

TabHost.OnTabChangeListener() {

public void onTabChanged(String tabId) {

Dialog dialog = new AlertDialog.Builder(tabHostDemo1.this) .setTitle("提示").setMessage(

"选中了" + tabId + "选项卡

").setIcon(R.drawable.icon).setPositiveButton("确定", new

DialogInterface.OnClickListener(){

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub } }).create(); dialog.show();

}

});

}

}

界面文件参考书程序12-22.

tabHostDemo2.java

package com.widget.demo;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.widget.TabHost;

public class tabHostDemo2 extends Activity {

/** Called when the activity is first created. */

private TabHost tabHost;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.tabhost2);

try{

tabHost = (TabHost) this.findViewById(R.id.TabHost01);

tabHost.setup();

tabHost.addTab(tabHost.newTabSpec("tab_1")

.setContent(R.id.LinearLayout1)

.setIndicator("TAB1",this.getResources().getDrawable(R.drawable.android)));

tabHost.addTab(tabHost.newTabSpec("tab_2")

.setContent(R.id.LinearLayout2).setIndicator("TAB2",

this.getResources().getDrawable(R.drawable.monkey))); tabHost.addTab(tabHost.newTabSpec("tab_3")

.setContent(R.id.LinearLayout3).setIndicator("TAB3", this.getResources().getDrawable(R.drawable.panda))); tabHost.setCurrentTab(1);

}catch(Exception ex){

ex.printStackTrace();

Log.d("EXCEPTION", ex.getMessage());

}

}

}

界面文件参考书程序12-24.

实验十五 实现菜单

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解选项菜单的使用方法。

2.了解上下文菜单的使用方法。

3.了解子菜单的使用方法。

4.了解Intent动态菜单选项的使用方法。

【实验内容】

实验题1.练习定制选项菜单。创建一个Android工程MyMenuDemo,活动名称main.java。运行后实现通过选项菜单来更新界面中的文本框的背景颜色。

【参考程序】

package com.demo.mymenu;

import android.app.Activity;

import android.content.Intent;

import android.graphics.Color;

import android.os.Bundle;

import android.view.ContextMenu;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.TextView;

import android.widget.Toast;

public class main extends Activity {

TextView selection;

public static final int Blue_ID = Menu.FIRST+1;

public static final int CYAN_ID = Menu.FIRST+2;

public static final int RED_ID = Menu.FIRST+3;

public static final int YELLOW_ID = Menu.FIRST+4;

public static final int GREEN_ID = Menu.FIRST+5;

public static final int DKGRAY_ID = Menu.FIRST+6;

public static final int MEGENTA_ID = Menu.FIRST+7;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

selection=(TextView)findViewById(R.id.selection);

//registerForContextMenu(selection);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) { populateMenu(menu);

return(super.onCreateOptionsMenu(menu));

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

return(applyMenuChoice(item) ||

super.onOptionsItemSelected(item));

//return( super.onOptionsItemSelected(item));

}

private void populateMenu(Menu menu) {

menu.add(Menu.NONE, RED_ID, Menu.NONE, "红色

").setIcon(R.drawable.palette).setAlphabeticShortcut('R').setIntent(i); menu.add(Menu.NONE, Blue_ID, Menu.NONE, "蓝色

").setIcon(R.drawable.palette).setAlphabeticShortcut('B');

menu.add(Menu.NONE, YELLOW_ID, Menu.NONE, "黄色").setIcon(R.drawable.palette).setAlphabeticShortcut('Y');

menu.add(Menu.NONE, CYAN_ID, Menu.NONE, "蓝绿

").setIcon(R.drawable.palette).setAlphabeticShortcut('C');

menu.add(Menu.NONE, GREEN_ID, Menu.NONE, "绿色").setIcon(R.drawable.palette).setAlphabeticShortcut('G');

menu.add(Menu.NONE, DKGRAY_ID, Menu.NONE, "深灰").setIcon(R.drawable.palette).setAlphabeticShortcut('D');

menu.add(Menu.NONE, MEGENTA_ID, Menu.NONE, "紫罗兰").setIcon(R.drawable.palette).setAlphabeticShortcut('M');

}

private boolean applyMenuChoice(MenuItem item) {

switch (item.getItemId()) {

case Blue_ID:

selection.setBackgroundColor(Color.BLUE);

return(true);

case CYAN_ID:

selection.setBackgroundColor(Color.CYAN);

return(true);

case DKGRAY_ID:

selection.setBackgroundColor(Color.DKGRAY); return(true);

case GREEN_ID:

selection.setBackgroundColor(Color.GREEN);

return(true);

case MEGENTA_ID:

selection.setBackgroundColor(Color.MAGENTA);

return(true);

case RED_ID:

selection.setBackgroundColor(Color.RED);

return(false);

case YELLOW_ID:

selection.setBackgroundColor(Color.YELLOW);

return(true);

}

return(false);

}

}

界面文件参考书程序13-1.

实验题2.练习菜单与Intent,使用setIntent方法为每个MenuItem绑定

Intent对象。修改1题的工程代码,参考书程序13-3修改main.java代码,观察结果变化。

实验题3.练习上下文菜单的使用。修改1题的工程代码,参考书程序13-4修改main.java代码,观察结果变化。

实验题4.练习Intent动态菜单选项。在1题的工程,添加两个活动

DynamicIntentMenu.java、show.java,res/menu下添加界面basic.xml,运行观察结果变化。

【参考程序】

DynamicIntentMenu.java

package com.demo.mymenu;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.ContextMenu;

import android.view.Menu;

import android.view.MenuInflater;

import android.view.MenuItem;

import android.view.View;

import android.widget.TextView;

public class DynamicIntentMenu extends Activity {

TextView selection;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

selection=(TextView)findViewById(R.id.selection);

registerForContextMenu(selection);

}

@Override

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {

new MenuInflater(getApplication()).inflate(R.menu.basic, menu); Intent intent = new Intent("com.demo.menu.DYNAMIC");

intent.addCategory(Intent.CATEGORY_SELECTED_ALTERNATIVE);

//注意这与创建选项菜单时是不同的

// Search and populate the menu with acceptable offering applications. menu.addIntentOptions(

R.id.dynamic, // Menu group to which new items will be added 0, // Unique item ID (none)

0, // Order for the items (none)

this.getComponentName(), // The current activity name

null, // Specific items to place first (none)

intent, // Intent created above that describes our requirements 0, // Additional flags to control items (none)

null); // Array of MenuItems that correlate to specific items (none) }

@Override

public boolean onContextItemSelected(MenuItem item) {

return super.onContextItemSelected(item);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

new MenuInflater(getApplication()).inflate(R.menu.basic, menu); Intent intent = new Intent("com.demo.menu.DYNAMIC");

intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

// Search and populate the menu with acceptable offering applications. menu.addIntentOptions(

R.id.dynamic, // Menu group to which new items will be added 0, // Unique item ID (none)

0, // Order for the items (none)

this.getComponentName(), // The current activity name null, // Specific items to place first (none)

intent, // Intent created above that describes our requirements 0, // Additional flags to control items (none)

null); // Array of MenuItems that correlate to specific items return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

return( super.onOptionsItemSelected(item));

}

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

return true;

}

}

show.java

package com.demo.mymenu;

import android.app.Activity;

import android.os.Bundle;

public class show extends Activity {

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.other);

}

}

basic.xml

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="/apk/res/android"> <item android:id="@+id/add" android:orderInCategory="3"

android:enabled="true" android:title="新建" />

<group android:id="@+id/dynamic" android:menuCategory="secondary" > <item android:id="@+id/share" android:orderInCategory="0"

android:title="共享" />

</group>

</menu>

工程主配置文件见书程序13-9.

实验题5.练习PopUpMenu。创建一个Android工程popupmenu,活动名称

main.java。

【参考程序】

main.java

package com.demo.w3;

import android.app.Activity;

import android.os.Bundle;

import android.view.MenuItem;

import android.view.View;

import android.widget.PopupMenu;

import android.widget.PopupMenu.OnMenuItemClickListener;

import android.widget.Toast;

public class main extends Activity {

PopupMenu pop=null;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

public void onpopupmenu(View button){

pop=new PopupMenu(this,button);

pop.getMenuInflater().inflate(R.menu.basic, pop.getMenu());

pop.setOnMenuItemClickListener(new OnMenuItemClickListener(){ @Override

public boolean onMenuItemClick(MenuItem arg0) {

// TODO Auto-generated method stub

Toast.makeText(getApplicationContext(), arg0.getTitle(), Toast.LENGTH_LONG).show();

return false;

}

}

);

pop.show();

}

public void onpopupmenu2(View button){

if(pop!=null)

pop.show();

}

}

main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView android:layout_width="fill_parent"

android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:text="Button" android:id="@+id/button1"

android:layout_width="wrap_content" android:onClick="onpopupmenu" android:layout_height="wrap_content"></Button>

<Button android:text="Button" android:id="@+id/button2"

android:layout_width="wrap_content" android:onClick="onpopupmenu2" android:layout_height="wrap_content"></Button>

</LinearLayout>

实验十六 通知的使用

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解Notification类使用。

2.掌握Toast类使用。

【实验内容】

实验题1.练习Toast的使用。创建一个Android工程ToastDemo,活动名称ToastDemo.java,当单击界面上按钮时,将显示一个Toast提示。

【参考程序】

package com.demo.toast;

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.Gravity;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;

public class ToastDemo extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// 通过 Tost.makeText().show() 来实现提示性的通知效果

// 短时间的提示性通知的 Demo

Button btn1 = (Button) this.findViewById(R.id.btn1);

btn1.setText("短时间提示");

btn1.setOnClickListener(new Button.OnClickListener() {

public void onClick(View v) {

Toast t = Toast.makeText(ToastDemo.this, "我是短时间提示", Toast.LENGTH_SHORT);

t.setGravity(Gravity.TOP | Gravity.LEFT, 100, 0);

t.setMargin(0.5f, 0.1f);

t.show();

}

});

// 短时间的提示性通知的 Demo

Button btn2 = (Button) this.findViewById(R.id.btn2);

btn2.setText("自定义" +

"View提示");

btn2.setOnClickListener(new Button.OnClickListener() {

public void onClick(View v) {

LayoutInflater vi = (LayoutInflater)

getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View view = vi.inflate(R.layout.toastview, null);

Toast toast = new Toast(ToastDemo.this);

toast.setView(view);

toast.setDuration(Toast.LENGTH_LONG);

toast.show();

}

});

}

}

界面文件见书程序15-1.

实验题2.练习Toast的使用,显示用户界面。1题的工程中修改

ToastDemo.java代码,参考书程序15-6,main.xml修改见书程序15-5,添加界面toastview.xml。

【参考程序】

toastview.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

<ImageView android:id="@+id/ImageView01"

android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon"></ImageView>

<TextView android:text="Hello Toast" android:id="@+id/TextView01"

android:layout_width="wrap_content"

android:layout_height="wrap_content"></TextView>

<Button android:text="@+id/Button01" android:id="@+id/Button01"

android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

</LinearLayout>

实验题3.练习Notification的使用。创建一个Android工程NotifyDemo,活动名称main.java,新建一个活动NotificationView.java。当单击界面上按钮时,将向状态栏新增一条Notification。

【参考程序】

main.java

package com.demo.notify;

import android.app.Activity;

import android.app.Notification;

import android.app.NotificationManager;

import android.app.PendingIntent;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class Main extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button btn4 = (Button) this.findViewById(R.id.btn4);

btn4.setText("发出一个通知(Notification)");

btn4.setOnClickListener(new Button.OnClickListener() {

public void onClick(View v) {

// 实例化一个通知,并指定其图标和标题(在提示栏上显示) Notification n = new Notification(R.drawable.icon, "Hi,android status notify", System.currentTimeMillis());

// 实例化通知管理器

NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// 指定单击通知后所打开的详细的通知页面(单击通知后打开 NotificationView)

PendingIntent contentIntent = PendingIntent.getActivity(

Main.this, 0, new Intent(Main.this, NotificationView.class), 0);

// 设置通知的发送人和通知的详细内容(打开提示栏后在通知列表中显示)

n.setLatestEventInfo(Main.this, "android", "just test", contentIntent);

// n.defaults |= Notification.DEFAULT_SOUND;

// n.sound=Uri.parse("file:///sdcard/06.mp3");

// 100 毫秒延迟后,震动 250 毫秒,暂停 100 毫秒后,再震动 500 毫秒

// n.vibrate = new long[] { 100, 250, 100, 500 };

// n.ledARGB = 0xff00ff00;

// n.ledOnMS = 3000;

// n.ledOffMS = 1000;

// n.flags |= Notification.FLAG_SHOW_LIGHTS;

n.defaults |= Notification.DEFAULT_LIGHTS;

// 发出通知(其中第一个参数为通知标识符)

nm.notify(0, n);

}

});

}

}

NotificationView.java

package com.demo.notify;

import android.app.Activity;

import android.app.NotificationManager;

import android.os.Bundle;

import android.widget.TextView;

// 单击通知列表的某个通知后,所打开的详细的通知页

public class NotificationView extends Activity {

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.view);

TextView txtMsg = (TextView)this.findViewById(R.id.txtMsg); txtMsg.setText("点通知之后所链接到的 Activity");

NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// 取消显示在通知列表中的指定通知(参数为通知标识符) nm.cancel(0);

// 需要关闭此 Activity 的话就 finish 它既可

// this.finish();

}

}

实验十七 实现Dialog

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解AlertDialog的实现方法。

2.了解Dialog的底层运行机制。

3. 了解自定义Dialog。

4.掌握Dialog事件处理。

5.掌握Dialog与Activity的交互。

【实验内容】

实验题1.练习AlertDialog的实现方法。创建一个Android工程DialogDemo,活动名称main.java。运行后在LogCat窗口观察提示信息,观察AlertDialog的实现过程,Activity是如何对Dialog进行托管的。

【参考程序】

package com.demo;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.TimeZone;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.Dialog;

import android.content.DialogInterface;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class main extends Activity {

private static final String DIALOG_DemoApp = "Dialog Demo app"; private static final int DIALOG_SIMPLE = 1;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button SimpleButtons = (Button) findViewById(R.id.SimpleDialog); SimpleButtons.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

showDialog(DIALOG_SIMPLE);

Log.i(DIALOG_DemoApp,"Dialog has been showned!...."); int temp=0;

for(int i=0;i<10;i++)temp+=i;

Log.i(DIALOG_DemoApp,"temp="+temp);

}

});

}

@Override

protected Dialog onCreateDialog(int id) {

Log.i(DIALOG_DemoApp, "onCreateDialog has been called"); switch (id) {

case DIALOG_SIMPLE:

return new AlertDialog.Builder(main.this)

.setTitle(R.string.DialogTitle)

.setMessage(R.string.Dialog_Message)

.setPositiveButton(R.string.Dialog_OK, new

DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

}

})

.setNegativeButton(R.string.Dialog_Cancle, new

DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

/* User clicked Cancel so do some stuff */ }

})

.create();

}

return null;

}

@Override

public void onPrepareDialog(int id, Dialog dialog){

Log.i(DIALOG_DemoApp, "onPrepareDialog has been called"); switch(id) {

case (DIALOG_SIMPLE) :

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));

Date currentTime = new

Date(java.lang.System.currentTimeMillis());

String dateString = sdf.format(currentTime);

AlertDialog m_Dialog = (AlertDialog)dialog;

m_Dialog.setMessage(dateString);

break;

}

}

}

界面文件参考书程序16-1.

实验题2.练习Dialog与Activity的交互。创建一个Android工程

DialogDemo2,活动名称main.java。界面上定义了一个TextView组件和一个Button组件,点击Button时,弹出Dialog,观察Dialog是如何与Activity交互数据的。

【参考程序】

package com.demo;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.Dialog;

import android.content.DialogInterface;

import android.content.res.Resources;

import android.os.Bundle;

import android.view.Gravity;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.Window;

import android.view.WindowManager;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.TextView;

public class main extends Activity {

private static final int DIALOG_Data_Exchange = 2;

String[] arr;

TextView txt;

String[] temp = new String[3];

Dialog dlg = null;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button SimpleButtons = (Button) findViewById(R.id.choose_button); SimpleButtons.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

showDialog(DIALOG_Data_Exchange);

}

});

Resources res = this.getResources();

{ arr = res.getStringArray(R.array.os); txt = (TextView) findViewById(R.id.result); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_Data_Exchange: dlg = new AlertDialog.Builder(main.this) .setMultiChoiceItems(R.array.os, new boolean[] { false, false, false }, new DialogInterface.OnMultiChoiceClickListener() public void onClick(DialogInterface dialog, int whichButton, boolean isChecked) { if (isChecked) { temp[whichButton] = arr[whichButton]; } else temp[whichButton] = ""; } }) .setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { /* User clicked Yes so do some stuff */ String temp2 = "your operate system is:"; for (int ii = 0; ii < 3; ii++) { if (temp[ii] != null) temp2 += temp[ii]; } txt.setText(temp2); } }) .setNegativeButton(R.string.dialog_cancle, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }).create(); return dlg; } return null; } public void settext(String s) {

txt.setText(s);

}

}

界面文件见书程序16-3.

实验题3.练习自定义Dialog。在2题的工程基础上,参照书程序16-6、16-7修改界面和活动代码。新增一个界面custom_dialog.xml,见程序16-5,观察自定义Dialog与AlertDialog有什么不同。

实验题4.练习特殊Dialog。在2题的工程基础上,增加一个活动

DateTimeDemo.java,新增一个界面datatime.xml,获取一个显示修改当前日期的对话框。

【参考程序】

DateTimeDemo.java

package com.demo;

import java.util.Calendar;

import android.app.Activity;

import android.app.DatePickerDialog;

import android.app.TimePickerDialog;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.DatePicker;

import android.widget.TextView;

import android.widget.TimePicker;

import android.widget.DatePicker.OnDateChangedListener;

import android.widget.TimePicker.OnTimeChangedListener;

public class DateTimeDemo extends Activity {

/** Called when the activity is first created. */

private DatePicker dpicker;

private TimePicker tpicker;

private Calendar c;

private TextView tview;

private Button btn1;

private Button btn2;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.datetime);

c = Calendar.getInstance();

dpicker = (DatePicker) this.findViewById(R.id.DatePicker01);

tpicker = (TimePicker) this.findViewById(R.id.TimePicker01);

btn1 = (Button) this.findViewById(R.id.Button01);

btn2 = (Button) this.findViewById(R.id.Button02);

tview = (TextView) this.findViewById(R.id.TextView01);

dpicker.init(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c .get(Calendar.DAY_OF_MONTH), new

OnDateChangedListener() {

public void onDateChanged(DatePicker arg0, int arg1, int arg2, int arg3) {

tview.setText("[" + arg1 + "-" + (arg2 + 1) + "-" + arg3 + "]" + "[" + arg0.getYear() + "-" + (arg0.getMonth() + 1) + "-" + arg0.getDayOfMonth() + "]");

}

});

tpicker.setIs24HourView(true);// 设置是否为24小时制

tpicker.setCurrentHour(c.get(Calendar.HOUR_OF_DAY));

tpicker.setCurrentMinute(c.get(Calendar.MINUTE));

tpicker.setOnTimeChangedListener(new OnTimeChangedListener() { public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {

tview.setText("[" + hourOfDay + ":" + minute + "]" + "["

+ view.getCurrentHour() + ":" + view.getCurrentMinute()+ "]"); }

});

btn1.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

new DatePickerDialog(DateTimeDemo.this,

new DatePickerDialog.OnDateSetListener() {

public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { tview.setText("[" + year + "-"

+ (monthOfYear + 1) + "-" +

dayOfMonth

+ "]" + "[" + view.getYear() + "-" + (view.getMonth() + 1) + "-"

+ view.getDayOfMonth() + "]");

dpicker.init(year, monthOfYear, dayOfMonth, null);

}

}, dpicker.getYear(), dpicker.getMonth(), dpicker .getDayOfMonth()).show();

}

});

btn2.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

new TimePickerDialog(DateTimeDemo.this,

new TimePickerDialog.OnTimeSetListener() { public void onTimeSet(TimePicker view,

int hourOfDay, int minute) {

tview.setText("[" + hourOfDay + ":" + minute + "]" + "["

+ view.getCurrentHour() + ":" + view.getCurrentMinute()

+ "]");

tpicker.setCurrentHour(hourOfDay);

tpicker.setCurrentMinute(minute);

}

}, tpicker.getCurrentHour(),

tpicker.getCurrentMinute(), true).show();

}

});

}

}

datetime.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView android:layout_width="fill_parent"

android:id="@+id/TextView01" android:layout_height="wrap_content" android:text="" />

<DatePicker android:id="@+id/DatePicker01"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

</DatePicker>

<TimePicker android:id="@+id/TimePicker01"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

</TimePicker>

<Button android:text="设置日期" android:id="@+id/Button01"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

</Button>

<Button android:text="设置时间" android:id="@+id/Button02"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

</Button>

</LinearLayout>

实验十八 设置Alarm

【实验类型】设计性

【实验要求】必做

【实验目的】

1.了解Alarm的使用方法。

2.了解情景模式定时切换。

3.掌握闹钟应用的实现方法。

【实验内容】

实验题1.练习Alarm的使用方法。创建一个Android工程AlarmDemo,活动名称main.java,创建两个BroadcastReceiver类OneShotAlarm.java、

RepeatingAlarm.java。程序主界面包含3个功能按钮,分别用来启动单次Alarm、启动周期Alarm、停止周期Alarm。

【参考程序】

main.java

package com.demo.alarm;

import android.app.Activity;

import android.app.AlarmManager;

import android.app.PendingIntent;

import android.content.Intent;

import android.os.SystemClock;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;

import java.util.Calendar;

public class main extends Activity {

Toast mToast;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// Watch for button clicks.

Button button = (Button)findViewById(R.id.one_shot);

button.setOnClickListener(mOneShotListener);

button = (Button)findViewById(R.id.start_repeating);

button.setOnClickListener(mStartRepeatingListener);

button = (Button)findViewById(R.id.stop_repeating);

button.setOnClickListener(mStopRepeatingListener);

}

private OnClickListener mOneShotListener = new OnClickListener() { public void onClick(View v) {

// When the alarm goes off, we want to broadcast an Intent to our // BroadcastReceiver. Here we make an Intent with an explicit class

// name to have our own receiver (which has been published in // AndroidManifest.xml) instantiated and called, and then create an

// IntentSender to have the intent executed as a broadcast. Intent intent = new Intent(main.this, OneShotAlarm.class);

PendingIntent sender = PendingIntent.getBroadcast(main.this, 0, intent, 0);

// We want the alarm to go off 30 seconds from now.

Calendar calendar = Calendar.getInstance();

calendar.setTimeInMillis(System.currentTimeMillis());

calendar.add(Calendar.SECOND, 5);

// Schedule the alarm!

AlarmManager am =

(AlarmManager)getSystemService(ALARM_SERVICE);

am.set(AlarmManager.RTC_WAKEUP,

calendar.getTimeInMillis(), sender);

}

};

private OnClickListener mStartRepeatingListener = new OnClickListener() {

public void onClick(View v) {

// When the alarm goes off, we want to broadcast an Intent to our // BroadcastReceiver. Here we make an Intent with an explicit class

// name to have our own receiver (which has been published in // AndroidManifest.xml) instantiated and called, and then create an

// IntentSender to have the intent executed as a broadcast. // Note that unlike above, this IntentSender is configured to // allow itself to be sent multiple times.

Intent intent = new Intent(main.this, RepeatingAlarm.class); PendingIntent sender = PendingIntent.getBroadcast(main.this, 0, intent, 0);

// We want the alarm to go off 30 seconds from now.

long firstTime = SystemClock.elapsedRealtime();

firstTime += 5*1000;

// Schedule the alarm!

AlarmManager am =

(AlarmManager)getSystemService(ALARM_SERVICE);

am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,

firstTime, 5*1000, sender); }

};

private OnClickListener mStopRepeatingListener = new OnClickListener() {

public void onClick(View v) {

// Create the same intent, and thus a matching IntentSender, for // the one that was scheduled.

Intent intent = new Intent(main.this, RepeatingAlarm.class); PendingIntent sender = PendingIntent.getBroadcast(main.this, 0, intent, 0);

// And cancel the alarm.

AlarmManager am =

(AlarmManager)getSystemService(ALARM_SERVICE);

am.cancel(sender);

}

};

}

RepeatingAlarm.java

package com.demo.alarm;

import android.content.Context;

import android.content.Intent;

import android.content.BroadcastReceiver;

import android.widget.Toast;

/**

* This is an example of implement an {@link BroadcastReceiver} for an alarm that

* should occur once.

*/

public class RepeatingAlarm extends BroadcastReceiver

{

@Override

public void onReceive(Context context, Intent intent)

{

Toast.makeText(context, "重复闹钟被触发",

Toast.LENGTH_SHORT).show();

}

}

界面布局见书程序17-1,OneShotAlarm.java见书程序17-3.

实验题2.实现Alarm闹钟。在1题的工程中对OneShotAlarm.java文件加以修

改,在BroadcastReceiver的onReceived()方法中加入声音处理即可实现。

实验题3.练习情景模式定时切换。创建一个Android工程SmartChange,活动名称main.java,创建一个BroadcastReceiver类AlarmReceiver.java。运行后可以根据用户设置的时间范围自动实现设备切换到静音模式、振动模式等。

【参考程序】

AlarmReceiver.java

package com.demo.alarm;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.media.AudioManager;

import android.util.Log;

public class AlarmReceiver extends BroadcastReceiver{

public static final String VIBRATE_CHANGED =

"com.demo.smartchange.VIBRATE_CHANGED";

public static final String SILENT_CHANGED =

"com.demo.smartchange.SILENT_CHANGED";

public static final String RV_CHANGED =

"com.demo.smartchange.RV_CHANGED";

public static final String RING_CHANGED =

"com.demo.smartchange.RING_CHANGED";

public static final int REQUEST_CODE = 0;

String TAG = "AlarmReceiver";

@Override

public void onReceive(Context context, Intent intent) {

AudioManager audio = (AudioManager)

context.getSystemService(Context.AUDIO_SERVICE);

int checkedId = intent.getIntExtra("checkedId",0); Log.e(TAG,checkedId + intent.getAction());

//切换情景模式

switch (checkedId) {

case R.id.ring_and_vibrate: ringAndVibrate(audio); break; case R.id.vibrate: vibrate(audio); break;

case R.id.silent: silent(audio); break;

default: ring(audio); break;

}

}

//铃声和震动

protected void ringAndVibrate(AudioManager audio) {

audio.setRingerMode(AudioManager.RINGER_MODE_NORMAL); audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ON);

audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_ON);

}

//铃声

protected void ring(AudioManager audio) {

audio.setRingerMode(AudioManager.RINGER_MODE_NORMAL); audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF);

audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_OFF);

}

//震动

protected void vibrate(AudioManager audio) {

audio.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ON);

audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_ON);

}

//静音

protected void silent(AudioManager audio) {

audio.setRingerMode(AudioManager.RINGER_MODE_SILENT); audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF);

audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_OFF);

}

}

main.java

package com.demo.alarm;

import java.util.Date;

import android.app.Activity;

import android.app.AlarmManager;

import android.app.PendingIntent;

import android.content.Context;

import android.content.Intent;

import android.media.AudioManager;

import android.os.Bundle;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.RadioButton;

import android.widget.RadioGroup;

import android.widget.TimePicker;

import android.widget.RadioGroup.OnCheckedChangeListener;

public class main extends Activity {

String TAG="smartchange";

protected boolean isChange;

AlarmManager alarms;

TimePicker tp,tp1 ;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

alarms =

(AlarmManager)getSystemService(Context.ALARM_SERVICE);

tp = (TimePicker)findViewById(R.id.timePkr);

tp.setIs24HourView(true);

tp1 = (TimePicker)findViewById(R.id.timePkr2);

tp1.setIs24HourView(true);

//监视按钮变化

RadioGroup group = (RadioGroup) findViewById(R.id.menu);

group.setOnCheckedChangeListener(new

OnCheckedChangeListener() {

public void onCheckedChanged(RadioGroup group,

int checkedId) {

if (isChange)

return; switch (checkedId) {

case R.id.ring_and_vibrate:

ringAndVibrate(); break;

case R.id.ring: ring(); break;

case R.id.vibrate: vibrate();

break;

case R.id.silent: silent(); break;

}

RadioButton radio = (RadioButton)

findViewById(checkedId);

if (radio != null)

radio.setTextSize(30); main.this.waitClosing();

}

});

//RadioButton添加监听器

for (int i = 0, l = group.getChildCount(); i < l; i++) {

RadioButton radio = (RadioButton) group.getChildAt(i);

radio.setOnTouchListener(new OnTouchListener() {

public boolean onTouch(View v,

MotionEvent event) {

RadioButton radio = (RadioButton) v;

if (!radio.isChecked())

return false; radio.setTextSize(30);

main.this.waitClosing(); return false;

}

});

}

}

@Override

protected void onResume() {

super.onResume();

updateRadioGroup();

}

//更新情景模式

protected void updateRadioGroup() {

int checkedId = currentMode();

RadioButton checked = (RadioButton) findViewById(checkedId);

isChange = true;

checked.setChecked(true);

isChange = false;

}

//取得当前情景模式

protected int currentMode() {

AudioManager audio = (AudioManager)

getSystemService(Context.AUDIO_SERVICE);

switch (audio.getRingerMode()) {

case AudioManager.RINGER_MODE_SILENT: return

R.id.silent;

case AudioManager.RINGER_MODE_VIBRATE: return

R.id.vibrate;

}

if (audio.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER))

return R.id.ring_and_vibrate;

return R.id.ring;

}

protected String returnModeString(int oldmode){

switch(oldmode){

case R.id.silent: return AlarmReceiver.SILENT_CHANGED;

case R.id.vibrate:return AlarmReceiver.SILENT_CHANGED;

case R.id.ring_and_vibrate: return AlarmReceiver.RV_CHANGED; case R.id.ring:return AlarmReceiver.RING_CHANGED;

}

return AlarmReceiver.RING_CHANGED;

}

//铃声和震动

protected void ringAndVibrate() {

int temp=currentMode();

Log.e(TAG,""+R.id.ring_and_vibrate);

Intent intent = new Intent(AlarmReceiver.RV_CHANGED);

intent.putExtra("checkedId", R.id.ring_and_vibrate);

PendingIntent alarmIntent = PendingIntent.getBroadcast(this, AlarmReceiver.REQUEST_CODE,

intent,

0);

Log.e(TAG,""+intent);

alarms.set(AlarmManager.RTC_WAKEUP,getTime(), alarmIntent); ///////////////////////////////////////

//发送定时还原警告

Intent intent2 = new Intent(returnModeString(temp));

intent2.putExtra("checkedId", temp);

PendingIntent alarmIntent2 = PendingIntent.getBroadcast(this, AlarmReceiver.REQUEST_CODE+1,

intent2,

0);

Log.e(TAG,""+intent2);

AlarmManager

alarm2=(AlarmManager)getSystemService(Context.ALARM_SERVICE);

alarm2.set(AlarmManager.RTC_WAKEUP,getTime2(), alarmIntent2); }

//铃声

protected void ring() {

int temp=currentMode();

Log.e(TAG,""+R.id.ring);

Intent intent = new Intent(AlarmReceiver.RING_CHANGED); intent.putExtra("checkedId", R.id.ring);

PendingIntent alarmIntent = PendingIntent.getBroadcast(this, AlarmReceiver.REQUEST_CODE,

intent,

0);

Log.e(TAG,""+intent);

alarms.set(AlarmManager.RTC_WAKEUP,getTime(), alarmIntent); //发送定时还原警告

Intent intent2 = new Intent(returnModeString(temp));

intent2.putExtra("checkedId", temp);

PendingIntent alarmIntent2 = PendingIntent.getBroadcast(this, AlarmReceiver.REQUEST_CODE+1,

intent2,

0);

Log.e(TAG,""+intent2);

AlarmManager

alarm2=(AlarmManager)getSystemService(Context.ALARM_SERVICE);

alarm2.set(AlarmManager.RTC_WAKEUP,getTime2(), alarmIntent2); }

//震动

protected void vibrate() {

int temp=currentMode();

Log.e(TAG,""+R.id.vibrate);

Intent intent = new Intent(AlarmReceiver.VIBRATE_CHANGED); intent.putExtra("checkedId", R.id.vibrate);

PendingIntent alarmIntent = PendingIntent.getBroadcast(this, AlarmReceiver.REQUEST_CODE,

intent,

0);

Log.e(TAG,""+intent);

alarms.set(AlarmManager.RTC_WAKEUP,getTime(), alarmIntent); //发送定时还原警告

Intent intent2 = new Intent(returnModeString(temp));

intent2.putExtra("checkedId", temp);

PendingIntent alarmIntent2 = PendingIntent.getBroadcast(this, AlarmReceiver.REQUEST_CODE+1,

intent2,

0);

Log.e(TAG,""+intent2);

alarms.set(AlarmManager.RTC_WAKEUP,getTime2(), alarmIntent2); }

//静音

protected void silent() {

int temp=currentMode();

Log.i("smartchange","mode="+temp);

Log.e(TAG,""+R.id.silent);

Intent intent = new Intent(AlarmReceiver.SILENT_CHANGED); intent.putExtra("checkedId", R.id.silent);

PendingIntent alarmIntent = PendingIntent.getBroadcast(this, AlarmReceiver.REQUEST_CODE,

intent,

0);

Log.e(TAG,""+intent);

alarms.set(AlarmManager.RTC_WAKEUP,getTime(), alarmIntent); //发送定时还原警告

Intent intent2 = new Intent(returnModeString(temp));

intent2.putExtra("checkedId", temp);

PendingIntent alarmIntent2 = PendingIntent.getBroadcast(this, AlarmReceiver.REQUEST_CODE+1,

intent2,

0);

Log.e(TAG,""+intent2);

AlarmManager

alarm2=(AlarmManager)getSystemService(Context.ALARM_SERVICE);

alarm2.set(AlarmManager.RTC_WAKEUP,getTime2(), alarmIntent2); }

//关闭程序

protected void waitClosing() {

new Thread() {

public void run() {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {}

main.this.finish();

}

}.start();

}

//计算切换时间

private long getTime() {

Date dateNow = new Date();

long hour = tp.getCurrentHour()-dateNow.getHours();

if(hour<0)hour+=24;

long min = tp.getCurrentMinute()-dateNow.getMinutes(); long second = dateNow.getSeconds();

return dateNow.getTime() + (hour*60 + min)*60*1000 - second*1000; }

private long getTime2() {

Date dateNow = new Date();

long hour = tp1.getCurrentHour()-dateNow.getHours();

if(hour<0)hour+=24;

long min = tp1.getCurrentMinute()-dateNow.getMinutes();

long second = dateNow.getSeconds();

return dateNow.getTime() + (hour*60 + min)*60*1000 - second*1000; }

}

界面文件参考书程序17-9,工程主配置文件参考书程序17-10.

实验十九 实现触摸处理

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解触摸处理的原理。

2.了解多点触控的处理方法。

【实验内容】

实验题1.练习触摸处理的实现。创建一个Android工程TouchDemo,活动名称main.java,创建三个Button扩展类MyButton.java,MyFalseButton.java,MyTrueButton.java。运行后在LogCat窗口观察提示信息。

【参考程序】

main.java

package com.demo.touch2;

import android.app.Activity;

import android.os.Bundle;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.Button;

import android.widget.LinearLayout;

public class main extends Activity implements OnTouchListener { /** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button trueBtn1 = (Button)findViewById(R.id.trueBtn1);

trueBtn1.setOnTouchListener(this);

Button falseBtn1 = (Button)findViewById(R.id.falseBtn1); falseBtn1.setOnTouchListener(this);

}

@Override

public boolean onTouch(View v, MotionEvent event) {

String myTag = v.getTag().toString();

Log.v(myTag, "-----------------------------");

Log.v(myTag, "Got view " + myTag + " in onTouch");

Log.v(myTag, showEventInfo(v, event));

if( "true".equals(myTag.substring(0, 4))) {

Log.v(myTag, "返回 true");

return true;

}

else {

Log.v(myTag, "返回 false");

return false;

}

}

protected static String showEventInfo(View view, MotionEvent event) { StringBuilder result = new StringBuilder(300);

result.append("Action: ").append(event.getAction()).append("\n"); result.append("Location: ").append(event.getX()).append(" x

").append(event.getY()).append("\n");

if( event.getX() < 0 || event.getX() > view.getWidth() ||

event.getY() < 0 || event.getY() > view.getHeight()) { result.append(">>> Touch has left the view <<<\n");

}

result.append("Edge flags:

").append(event.getEdgeFlags()).append("\n");

result.append("Pressure: ").append(event.getPressure()).append(" ");

result.append("Size: ").append(event.getSize()).append("\n"); result.append("Down time:

").append(event.getDownTime()).append("ms\n");

result.append("Event time:

").append(event.getEventTime()).append("ms");

result.append("Elapsed:

").append(event.getEventTime()-event.getDownTime());

result.append(" ms\n");

return result.toString();

}

}

MyButton.java

package com.demo.touch2;

import android.content.Context;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.widget.Button;

public abstract class MyButton extends Button {

protected boolean myValue() {

return false;

}

public MyButton(Context context, AttributeSet attrs) { super(context, attrs);

}

@Override

public boolean onTouchEvent(MotionEvent event) { String myTag = this.getTag().toString();

Log.v(myTag, "----------------------------onTouchEvent"); Log.v(myTag, main.showEventInfo(this, event)); Log.v(myTag, "super onTouchEvent() returns " + super.onTouchEvent(event));

Log.v(myTag, "and I'm returning "+myValue());

event.recycle();

return(myValue());

// return true;

}

}

MyFalseButton.java

package com.demo.touch2;

import android.content.Context;

import android.util.AttributeSet;

public class MyFalseButton extends MyButton {

protected boolean myValue() {

return false;

}

public MyFalseButton(Context context, AttributeSet attrs) { super(context, attrs);

}

}

MyTrueButton.java

package com.demo.touch2;

import android.content.Context;

import android.util.AttributeSet;

public class MyTrueButton extends MyButton {

protected boolean myValue() {

return true;

}

public MyTrueButton(Context context, AttributeSet attrs) {

super(context, attrs);

}

}

界面文件见书程序18-4.

实验题2.练习多点触控的实现。在1题的工程中,创建一个活动

MultiTouchDemo.java,创建一个界面picture.xml。改程序只能在真机上才能实验出效果。

【参考程序】

MultiTouchDemo.java

package com.demo.touch2;

import android.app.Activity;

import android.graphics.Matrix;

import android.os.Bundle;

import android.util.FloatMath;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.ImageView;

public class MultiTouchDemo extends Activity implements OnTouchListener { Matrix matrix = new Matrix();

Matrix eventMatrix = new Matrix();

final static int NONE = 0;

final static int DRAG = 1;

final static int ZOOM = 2;

int touchState = NONE;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.picture);

ImageView view = (ImageView) findViewById(R.id.imageView);

view.setOnTouchListener(this);

}

final static float MIN_DIST = 50;

static float eventDistance = 0;

static float centerX =0, centerY = 0;

@Override

public boolean onTouch(View v, MotionEvent event) {

ImageView view = (ImageView) v;

switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

touchState = DRAG;

centerX = event.getX(0);

centerY = event.getY(0); eventMatrix.set(matrix); break; case MotionEvent.ACTION_POINTER_DOWN: eventDistance = getDistance(event); getMidpoint(centerX, centerY, event); if (eventDistance > MIN_DIST) { eventMatrix.set(matrix); touchState = ZOOM; } break; case MotionEvent.ACTION_MOVE: if (touchState == DRAG) { matrix.set(eventMatrix); matrix.setTranslate(event.getX(0) - centerX, event.getY(0) - centerY); } else if (touchState == ZOOM) { float dist = getDistance(event); if (dist > MIN_DIST) { matrix.set(eventMatrix); float scale = dist / eventDistance; matrix.postScale(scale, scale, centerX, centerY); } } view.setImageMatrix(matrix); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: touchState = NONE; break; } return true; } private float getDistance(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } private void getMidpoint(float centerX, float centerY, MotionEvent event) { centerX = (event.getX(0) + event.getX(1))/2; centerY = (event.getY(0) + event.getY(1))/2; } }

picture.xml

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout

xmlns:android="/apk/res/android" android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<ImageView android:id="@+id/imageView"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:src="@drawable/icon"

android:scaleType="matrix" >

</ImageView>

</FrameLayout>

实验二十 线程间通信

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解AsyncTask类使用方法。

2.掌握线程间通信的方法。

【实验内容】

实验题1.练习线程间通信的方法。创建一个Android工程ThreadDemo,活动名称ListProgressDemo.java。运行后观察结果。

【参考程序】

package com.demo.thread;

import java.util.ArrayList;

import android.app.Activity;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.os.Bundle;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.ListView;

import android.widget.Toast;

public class ListProgressDemo extends Activity {

private ListView list=null;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

((Button) findViewById(R.id.load))

.setOnClickListener(new View.OnClickListener() { @Override

public void onClick(View view) {

data = null;

data = new ArrayList<String>();

adapter = null;

showDialog(PROGRESS_DIALOG);

new ProgressThread(handler, data).start();

} }); list=(ListView) findViewById(R.id.listView1); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case PROGRESS_DIALOG: return ProgressDialog.show(this, "", "正在加载,请稍侯...", true); default: return null; } } private class ProgressThread extends Thread { private Handler handler; private ArrayList<String> data; public ProgressThread(Handler handler, ArrayList<String> data) { this.handler = handler; this.data = data; } @Override public void run() { for (int i = 0; i < 10; i++) { data.add("项目"+Integer.toString(i)); try { Thread.sleep(1000); } catch (InterruptedException e) { Message msg = handler.obtainMessage(); Bundle b = new Bundle(); b.putInt("state", STATE_ERROR); msg.setData(b); handler.sendMessage(msg); } } Message msg = handler.obtainMessage(); Bundle b = new Bundle(); b.putInt("state", STATE_FINISH); msg.setData(b); handler.sendMessage(msg); } } private final Handler handler = new Handler(Looper.getMainLooper()) { public void handleMessage(Message msg) { // 处理Message,更新

ListView

int state = msg.getData().getInt("state");

switch (state) {

case STATE_FINISH:

dismissDialog(PROGRESS_DIALOG);

Toast.makeText(getApplicationContext(),

"加载完成!",

Toast.LENGTH_LONG)

.show();

adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,

data);

list.setAdapter(adapter);

break;

case STATE_ERROR:

dismissDialog(PROGRESS_DIALOG);

Toast.makeText(getApplicationContext(),

"处理过程发生错误!",

Toast.LENGTH_LONG)

.show();

adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,

data);

list.setAdapter(adapter);

break;

default:

}

}

};

private ArrayAdapter<String> adapter;

private ArrayList<String> data;

private static final int PROGRESS_DIALOG = 1;

private static final int STATE_FINISH = 1;

private static final int STATE_ERROR = -1;

}

界面文件见书程序20-1.

实验题2.练习AsyncTask的使用方法。在1题的工程中,新建一个活动名称AsyncTaskDemo.java。运行后观察结果。

【参考程序】

package com.demo.thread;

import java.util.ArrayList;

import android.app.Activity;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.os.AsyncTask;

import android.os.Bundle;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.ListView;

import android.widget.Toast;

public class AsyncTaskDemo extends Activity {

private ListView list = null;

private ProgressDialog m_pDialog=null;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

((Button) findViewById(R.id.load))

.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

data = null;

data = new ArrayList<String>();

//adapter = null;

// showDialog(PROGRESS_DIALOG);

// new ProgressThread(handler, data).start();

new ProgressTask().execute(data);

}

});

list = (ListView) findViewById(R.id.listView1);

}

@Override

protected Dialog onCreateDialog(int id) {

switch (id) {

case PROGRESS_DIALOG:

m_pDialog = new ProgressDialog(AsyncTaskDemo.this); // 设置进度条风格,风格为长形 m_pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 设置ProgressDialog 标题

m_pDialog.setTitle("提示"); // 设置ProgressDialog 提示信息

m_pDialog.setMessage("数据加载中..."); // 设置ProgressDialog 标题图标

m_pDialog.setIcon(R.drawable.load); // 设置ProgressDialog 进度条进度

m_pDialog.setMax(1000); // 设置ProgressDialog 的进度条是否不明确

m_pDialog.setIndeterminate(false); // 让ProgressDialog显示

m_pDialog.show();

return m_pDialog;

//return ProgressDialog.show(this, "", "正在加载,请稍侯...", true);

default:

return null;

}

}

private class ProgressTask extends

AsyncTask<ArrayList<String>, Integer, Integer> {

/* 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中

做一些准备工作,如在界面上显示一个进度条。 */

@Override

protected void onPreExecute() {

// 先显示ProgressDialog

showDialog(PROGRESS_DIALOG);

}

/* 执行那些很耗时的后台计算工作。可以调用publishProgress方法来更

新实时的任务进度。 */

@Override

protected Integer doInBackground(ArrayList<String>... datas) {

ArrayList<String> data = datas[0];

for (int i = 0; i < 1000; i++) {

data.add("项目"+Integer.toString(i));

publishProgress(i);

}

return STATE_FINISH;

}

@Override

protected void onCancelled() {

super.onCancelled();

}

@Override

protected void onProgressUpdate(Integer... values) {

// 更新进度

m_pDialog.setProgress(values[0]);

}

/*

* 在doInBackground 执行完成后,onPostExecute 方法将被UI thread

调用,

*

} * 后台的计算结果将通过该方法传递到UI thread. */ @Override protected void onPostExecute(Integer result) { int state = result.intValue(); switch (state) { case STATE_FINISH: dismissDialog(PROGRESS_DIALOG); Toast.makeText(getApplicationContext(), "加载完成!", Toast.LENGTH_LONG) .show(); adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, data); list.setAdapter(adapter); break; case STATE_ERROR: dismissDialog(PROGRESS_DIALOG); Toast.makeText(getApplicationContext(), "处理过程发生错误!", Toast.LENGTH_LONG) .show(); adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, data); list.setAdapter(adapter); break; default: } } } private ArrayAdapter<String> adapter; private ArrayList<String> data; private static final int PROGRESS_DIALOG = 1; private static final int STATE_FINISH = 1; private static final int STATE_ERROR = -1;

实验二十一 使用Preferences保存数据

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解监听Preferences变化方法。

2.了解PreferencesActivity的实现方法。

3.掌握操作Preferences类的方法。

【实验内容】

实验题1.练习操作Preferences类的方法。创建一个Android工程

preferenceDemo,活动名称main.java。运行后观察运行结果。

【参考程序】

package com.demo.preference;

import java.text.SimpleDateFormat;

import java.util.Date;

import android.app.Activity;

import android.content.SharedPreferences;

import

android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle;

import android.preference.PreferenceManager;

import android.text.format.DateFormat;

import android.util.Log;

import android.widget.TextView;

public class main extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

SharedPreferences mPerferences = PreferenceManager

.getDefaultSharedPreferences(this);

int counter = mPerferences.getInt("counter", 0);

// 注册监听器

mPerferences

.registerOnSharedPreferenceChangeListener(new

OnSharedPreferenceChangeListener() {

@Override

public void onSharedPreferenceChanged(

SharedPreferences sharedPreferences, String key)

{

// TODO Auto-generated method stub

if (key.equals("counter")) {

int i = sharedPreferences.getInt("counter", 0); Log.i("SharePreferenceMonitor",

"application has been start" + i + "times"); }

}

});

// 获取activity私有的preference

SharedPreferences m_privatepreference = this

.getPreferences(MODE_PRIVATE);

String m_date = m_privatepreference.getString("date", "");

if (!m_date.equals(""))

m_date = "上次启动时间:" + m_date;

TextView mTextView = (TextView) findViewById(R.id.text);

mTextView.setText("应用已经被启动" + counter + " 次 " + m_date); SharedPreferences.Editor mEditor = mPerferences.edit();

mEditor.putInt("counter", ++counter);

mEditor.commit();

Date dt = new Date();// 如果不需要格式,可直接用dt,dt就是当前系统时间

SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd

HH:mm:ss");// 设置显示格式

String nowTime = "";

nowTime = df.format(dt);// 用DateFormat的format()方法在dt中获取并以yyyy/MM/dd

// HH:mm:ss格式显示

SharedPreferences.Editor mEditor2 = m_privatepreference.edit(); mEditor2.putString("date", nowTime);

mEditor2.commit();

}

}

界面文件见书程序21-1.

实验题2.练习监听Preferences变化的方法。在1题的工程中修改main.java文件代码,增加一个应用启动次数的监听功能。参考书程序21-4.

实验题3.练习PreferencesActivity类的使用方法。创建一个Android工程PreferenceactivityDemo,活动名称main.java。界面设计参考书21-5节,运行后观察运行结果。

【参考程序】

package com.demo.preferenceactivitydemo;

import android.os.Bundle;

import android.preference.CheckBoxPreference;

import android.preference.Preference;

import android.preference.PreferenceActivity;

import android.preference.PreferenceScreen;

import android.util.Log;

import android.widget.Toast;

public class main extends PreferenceActivity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preference);

}

@Override

public boolean onPreferenceTreeClick(PreferenceScreen

preferenceScreen,

Preference preference) {

Log.i("PreferenceActivity",preference.getKey()+"has been changed"); if(preference.getKey().equals("sport1")){

if(((CheckBoxPreference)preference).isChecked() ){

Log.i("PreferenceActivity",preference.getKey()+"has been checck");

}

else

Log.i("PreferenceActivity",preference.getKey()+"has been uncheck");

}

return true;

}

}

实验题4.练习共享PreferencesActivity的数据。在3题工程中,增加一个活动名称other.java,界面修改参考书21-9节,运行后观察运行结果。

【参考程序】

package com.demo.preferenceactivitydemo;

import android.app.Activity;

import android.content.Intent;

import android.content.SharedPreferences;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

public class other extends Activity implements View.OnClickListener {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextView t = (TextView) this.findViewById(R.id.tv01);

SharedPreferences spc =

this.getSharedPreferences("com.demo.preferenceactivitydemo_preferences",MODE_WORLD_WRITEABLE );

String name=spc.getString("name", "");

SharedPreferences.Editor e=spc.edit();

e.putString("name", "changed");

e.commit();

t.setText("您当前设置的姓名是:"+name);

Button bt = (Button) this.findViewById(R.id.Button01);

bt.setOnClickListener(this);

}

public void onClick(View v) {

switch (v.getId()) {

case R.id.Button01:

Intent intent = new Intent(this, main.class);

startActivity(intent);

break;

default:

break;

}

}

}

实验题1.练习自定义Preferences类的方法。创建一个Android工程

CustomPreference,活动名称main.java,新建两个类MySeekBarPreference.java、MyCustSeekBarPreference.java。运行后观察运行结果。

【参考程序】

main.java

package com.demo.custompreference;

import android.os.Bundle;

import android.preference.PreferenceActivity;

public class main extends PreferenceActivity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preference);

}

}

MySeekBarPreference.java

package com.demo.custompreference;

import android.app.AlertDialog.Builder;

import android.content.Context;

import android.preference.DialogPreference;

import android.util.AttributeSet;

import android.view.ViewGroup;

import android.widget.LinearLayout;

import android.widget.SeekBar;

public class MySeekBarPreference extends DialogPreference {

private Context context;

private SeekBar sensitivityLevel = null;

private LinearLayout layout = null;

public MySeekBarPreference(Context context, AttributeSet attrs) { super(context, attrs);

this.context = context;

persistInt(10);

}

protected void onPrepareDialogBuilder(Builder builder) {

// 添加布局

layout = new LinearLayout(context);

layout.setLayoutParams(new LinearLayout.LayoutParams(

LinearLayout.LayoutParams.FILL_PARENT,

LinearLayout.LayoutParams.WRAP_CONTENT)); // 布局属性 layout.setMinimumWidth(400); // 布局的最小宽度

layout.setPadding(20, 20, 20, 20); // 上下左右的Padding

// 添加SeekBar

sensitivityLevel = new SeekBar(context);

sensitivityLevel.setMax(100); // 最大值

sensitivityLevel.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT,

ViewGroup.LayoutParams.WRAP_CONTENT)); // SeekBar的布局属性

sensitivityLevel.setProgress(getPersistedInt(10)); // 设置默认值

layout.addView(sensitivityLevel); // 把SeekBar加到 layout的布局中 builder.setView(layout);

}

protected void onDialogClosed(boolean positiveResult) {

if (positiveResult) {

persistInt(sensitivityLevel.getProgress()); // 保存SeekBar的值 }

super.onDialogClosed(positiveResult);

}

}

MyCustSeekBarPreference.java

package com.demo.custompreference;

import android.content.Context;

import android.content.SharedPreferences;

import android.content.res.TypedArray;

import android.graphics.Typeface;

import android.preference.Preference;

import android.util.AttributeSet;

import android.view.Gravity;

import android.view.View;

import android.view.ViewGroup;

import android.widget.LinearLayout;

import android.widget.SeekBar;

import android.widget.TextView;

import android.widget.SeekBar.OnSeekBarChangeListener;

public class MyCustSeekBarPreference extends Preference implements OnSeekBarChangeListener {

public static int maximum = 78; // 由于目前是针对字体的所有最大值设成 78

public static int interval = 1; // 按照 1增长

private float oldValue = 50;

private TextView monitorBox;

public MyCustSeekBarPreference(Context context) {

super(context);

}

public MyCustSeekBarPreference(Context context, AttributeSet attrs) { super(context, attrs);

}

public MyCustSeekBarPreference(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

@Override

protected View onCreateView(ViewGroup parent) {

// 定义布局

LinearLayout layout = new LinearLayout(getContext());

// 定义属性1

LinearLayout.LayoutParams params1 = new

LinearLayout.LayoutParams(

LinearLayout.LayoutParams.WRAP_CONTENT,

LinearLayout.LayoutParams.WRAP_CONTENT);

params1.gravity = Gravity.CENTER_VERTICAL;

params1.weight = 1.0f;

// 定义属性2

LinearLayout.LayoutParams params2 = new

LinearLayout.LayoutParams(90,LinearLayout.LayoutParams.WRAP_CONTENT);

params2.gravity = Gravity.CENTER_VERTICAL;

// 定义属性2

LinearLayout.LayoutParams params3 = new

LinearLayout.LayoutParams(110,

LinearLayout.LayoutParams.WRAP_CONTENT);

params3.gravity = Gravity.CENTER;

layout.setPadding(15, 5, 2, 5);

layout.setOrientation(LinearLayout.HORIZONTAL);

TextView view = new TextView(getContext());

view.setText(getTitle());

view.setTextSize(18);

view.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD);

view.setGravity(Gravity.LEFT);

view.setLayoutParams(params1);

SeekBar bar = new SeekBar(getContext());

bar.setMax(maximum);

bar.setProgress((int) this.oldValue);

bar.setLayoutParams(params2);

bar.setOnSeekBarChangeListener(this);

this.monitorBox = new TextView(getContext());

this.monitorBox.setTypeface(Typeface.MONOSPACE,

Typeface.ITALIC);

this.monitorBox.setLayoutParams(params3);

this.monitorBox.setPadding(2, 0, 0, 0);

this.monitorBox.setText(bar.getProgress() + "");

this.monitorBox.setTextSize(bar.getProgress());

layout.addView(view);

layout.addView(bar);

layout.addView(this.monitorBox);

layout.setId(android.R.id.widget_frame);

return layout;

}

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

progress = Math.round(((float) progress) / interval) * interval;

if (progress < 10)

{

progress = 10;

} else if (progress > 72)

{

progress = 72;

}

if (!callChangeListener(progress)) {

seekBar.setProgress((int) this.oldValue);

return;

}

seekBar.setProgress(progress);

this.oldValue = progress;

this.monitorBox.setText(progress + "");

this.monitorBox.setTextSize(progress); // 设置 monitorBox 的字体大小跟着SeekBar变化

updatePreference(progress);

notifyChanged();

}

public void onStartTrackingTouch(SeekBar seekBar) {

}

public void onStopTrackingTouch(SeekBar seekBar) {

}

@Override

protected Object onGetDefaultValue(TypedArray ta, int index) {

int dValue = (int) ta.getInt(index, 50);

return validateValue(dValue);

}

@Override

protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {

int temp = restoreValue ? getPersistedInt(50) : (Integer) defaultValue; if (!restoreValue)

persistInt(temp);

this.oldValue = temp;

}

private int validateValue(int value) {

if (value > 72)

value = 72;

else if (value < 10)

value = 10;

else if (value % interval != 0)

value = Math.round(((float) value) / interval) * interval;

return value;

}

private void updatePreference(int newValue) {

SharedPreferences.Editor editor = getEditor();

editor.putInt(getKey(), newValue);

editor.commit();

}

}

main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android" android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

/>

</LinearLayout>

实验二十二 文件操作

【实验类型】验证性

【实验要求】必做

【实验目的】

1.了解中文乱码处理方法。

2.了解操作SD卡上的文件的方法。

3.掌握文件读写操作。

【实验内容】

实验题1.练习文件读写操作。创建一个Android工程SimpleFile,活动名称main.java。运行后观察运行结果。

【参考程序】

main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="/apk/res/android" android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<RelativeLayout

xmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

<TextView

android:id="@+id/label_01"

android:text="@string/label_01"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

<EditText

android:id="@+id/fileName"

android:layout_toRightOf="@id/label_01"

android:layout_alignTop="@id/label_01"

android:layout_width="160px"

android:layout_height="wrap_content" />

</RelativeLayout>

<TextView

android:id="@+id/label_02"

android:text="@string/label_02"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

<EditText

android:id="@+id/content"

android:layout_width="fill_parent"

android:layout_height="120px" />

<LinearLayout

xmlns:android="/apk/res/android" android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="wrap_content" >

<Button

android:id="@+id/saveButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/save"

android:gravity="right" />

<Button

android:id="@+id/viewButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/read"

android:gravity="right" />

</LinearLayout>

<TextView

android:id="@+id/textContent"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

</LinearLayout>

main.java

package com.demo.simplefile;

import java.io.ByteArrayOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

public class main extends Activity {

private EditText fileName;

/>

private EditText content;

private TextView textContent;

private static final String TAG = "simplefile";

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

fileName = (EditText) this.findViewById(R.id.fileName);

content = (EditText) this.findViewById(R.id.content);

textContent = (TextView) this.findViewById(R.id.textContent);

Button saveBtn = (Button)this.findViewById(R.id.saveButton);

Button viewBtn = (Button)this.findViewById(R.id.viewButton); saveBtn.setOnClickListener(listener);//保存按钮事件监听

viewBtn.setOnClickListener(listener);//查看按钮事件监听

}

private View.OnClickListener listener = new View.OnClickListener(){ public void onClick(View v) {

// TODO Auto-generated method stub

Button button = (Button) v;

String nameStr = fileName.getText().toString().trim();

String contentStr = content.getText().toString(); switch(button.getId())

{

case R.id.saveButton :

int resId_s = R.string.success;

OutputStream fileOS = null;

try {

fileOS = main.this.openFileOutput(nameStr+".txt", Context.MODE_APPEND);

fileOS.write(contentStr.getBytes());

fileOS.close();

} catch (Exception e) {

resId_s = R.string.failure;

e.printStackTrace();

}

//界面提示

Toast.makeText(main.this, resId_s,

Toast.LENGTH_LONG).show();

Log.i(TAG, nameStr);

Log.i(TAG, contentStr);

break;

case R.id.viewButton :

int resId_v = R.string.readSucc;

InputStream fileIS = null;

String contentSt = null;

try {

fileIS = main.this.openFileInput(nameStr+".txt"); ByteArrayOutputStream oStream = new

ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len = -1;

while((len = fileIS.read(buffer)) != -1){

oStream.write(buffer, 0, len);

}

contentSt = oStream.toString("GBK");

//contentSt = oStream.toString();

oStream.close();

fileIS.close();

} catch (Exception e) {

resId_v = R.string.readFail;

e.printStackTrace();

return;

}

textContent.setText(contentSt);

Log.i(TAG, contentSt);

Toast.makeText(main.this, resId_v,

Toast.LENGTH_LONG).show();

Log.i(TAG, nameStr);

break;

}

}

};

}

实验题2.练习操作SD卡上的文件。在1题的工程中,创建一个活动名称SDFile.java。运行后观察运行结果。

【参考程序】

package com.demo.simplefile;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.os.Environment;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

public class SDFile extends Activity {

private EditText fileName;

private EditText content;

private TextView textContent;

private static final String TAG = "simplefile";

SDCardListener myfilelistener = new SDCardListener("/sdcard"); public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

fileName = (EditText) this.findViewById(R.id.fileName);

content = (EditText) this.findViewById(R.id.content);

textContent = (TextView) this.findViewById(R.id.textContent);

Button saveBtn = (Button)this.findViewById(R.id.saveButton);

Button viewBtn = (Button)this.findViewById(R.id.viewButton); saveBtn.setOnClickListener(listener);//保存按钮事件监听

viewBtn.setOnClickListener(listener);//查看按钮事件监听 }

private View.OnClickListener listener = new View.OnClickListener(){ public void onClick(View v) {

// TODO Auto-generated method stub

Button button = (Button) v;

String nameStr = fileName.getText().toString().trim();

String contentStr = content.getText().toString(); switch(button.getId())

{

case R.id.saveButton :

int resId_s = R.string.success;

OutputStream fileOS = null;

try {

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

FileOutputStream outstream=new

FileOutputStream("/sdcard/"+nameStr+".txt");

outstream.write(contentStr.getBytes());

outstream.close();

}

else

return;

} catch (Exception e) {

resId_s = R.string.failure;

e.printStackTrace();

}

//界面提示

Toast.makeText(SDFile.this, resId_s,

Toast.LENGTH_LONG).show();

Log.i(TAG, nameStr);

Log.i(TAG, contentStr);

break;

case R.id.viewButton :

int resId_v = R.string.readSucc;

InputStream fileIS = null;

String contentSt = null;

try {

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

File sdCardDir =

Environment.getExternalStorageDirectory();//获取SDCard目录

File saveFile = new File(sdCardDir,

nameStr+".txt");

FileInputStream inStream = new

FileInputStream(saveFile);

ByteArrayOutputStream oStream = new

ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len = -1;

while((len = inStream.read(buffer)) != -1){ oStream.write(buffer, 0, len);

}

contentSt = oStream.toString();

//contentSt = oStream.toString();

oStream.close();

inStream.close();

}

else{

Toast.makeText(SDFile.this, "SD卡不存在", Toast.LENGTH_LONG).show();

}

} catch (Exception e) {

resId_v = R.string.readFail;

e.printStackTrace();

return;

}

textContent.setText(contentSt);

Log.i(TAG, contentSt);

Toast.makeText(SDFile.this, resId_v,

Toast.LENGTH_LONG).show();

Log.i(TAG, nameStr);

break;

}

}

};

}

工程主配置文件见书程序22-4.

实验题3.练习文件监听器的实现。在1题的工程中,创建一个活动名称

SDCardListener.java,并参考书程序22-6修改SDFile.java文件。运行后观察运行结果。

【参考程序】

SDCardListener.java

package com.demo.simplefile;

import android.os.FileObserver;

import android.util.Log;

public class SDCardListener extends FileObserver {

public SDCardListener(String path) {

super(path);

}

@Override

public void onEvent(int event, String path) {

switch (event) {

case FileObserver.CREATE:

Log.d("Create", "filename:" + path);

break;

case FileObserver.ALL_EVENTS:

Log.d("all", "filename:" + path);

break;

}

}

}

实验二十三 综合小程序(一)

【实验类型】设计性

【实验要求】必做

【实验目的】

1.掌握综合运用前面所学知识的能力。

2.编写一个音乐播放器。

【实验内容】

实验题1.创建一个Android工程musicPlayer,活动名称musicActivity.java,主要完成音乐文件的读取、播放、暂停等操作;创建一个类MusicFilter.java,主要实现读取指定后缀名的文件;创建一个类viewHolder.java,主要定义程序的界面。

Android应用开发基础实验指导书

图1

【参考程序】

musicActivity.java

package com.terry;

import java.io.File;

import java.util.ArrayList;

import java.util.List;

import android.app.ListActivity;

import android.media.MediaPlayer;

import android.media.MediaPlayer.OnCompletionListener;

import android.os.Bundle;

import android.view.KeyEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.ListView;

import android.widget.Toast;

public class musicActivity extends ListActivity {

//播放对象

private MediaPlayer myMediaPlayer;

//播放列表

private List<String> myMusicList=new ArrayList<String>();

//当前播放歌曲的索引

private int currentListItem=0;

//音乐的路径

private static final String MUSIC_PATH=new String("/sdcard/"); /** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

myMediaPlayer=new MediaPlayer();

findView();

musicList();

listener();

}

//绑定音乐

void musicList(){

File home=new File(MUSIC_PATH);

if(home.listFiles(new MusicFilter()).length>0){

for(File file:home.listFiles(new MusicFilter())){

myMusicList.add(file.getName());

}

ArrayAdapter<String> musicList=new ArrayAdapter<String> (musicActivity.this,R.layout.musicitme, myMusicList); setListAdapter(musicList);

}

}

//获取按钮

void findView(){

viewHolder.start=(Button)findViewById(R.id.start);

viewHolder.stop=(Button)findViewById(R.id.stop);

viewHolder.next=(Button)findViewById(R.id.next);

viewHolder.pause=(Button)findViewById(R.id.pause);

viewHolder.last=(Button)findViewById(R.id.last);

}

//监听事件

void listener(){

//停止

viewHolder.stop.setOnClickListener(new OnClickListener() { @Override

public void onClick(View v) {

// TODO Auto-generated method stub

if(myMediaPlayer.isPlaying()){

myMediaPlayer.reset();

}

}

});

//开始

viewHolder.start.setOnClickListener(new OnClickListener() { @Override

public void onClick(View v) {

// TODO Auto-generated method stub

playMusic(MUSIC_PATH+myMusicList.get(currentListItem)); }

});

//下一首

viewHolder.next.setOnClickListener(new OnClickListener() { @Override

public void onClick(View v) {

// TODO Auto-generated method stub

nextMusic();

}

});

//暂停

viewHolder.pause.setOnClickListener(new OnClickListener() { @Override

public void onClick(View v) {

// TODO Auto-generated method stub

if(myMediaPlayer.isPlaying()){

myMediaPlayer.pause();

}else{

myMediaPlayer.start();

}

}

});

//上一首

viewHolder.last.setOnClickListener(new OnClickListener() { @Override

public void onClick(View v) {

// TODO Auto-generated method stub

lastMusic();

}

});

}

//播放音乐

void playMusic(String path){

try {

myMediaPlayer.reset();

myMediaPlayer.setDataSource(path);

myMediaPlayer.prepare();

myMediaPlayer.start();

myMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

// TODO Auto-generated method stub

nextMusic();

}

});

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

}

//下一首

void nextMusic(){

if(++currentListItem>=myMusicList.size()){

currentListItem=0;

}

else{

playMusic(MUSIC_PATH+myMusicList.get(currentListItem)); }

}

//上一首

void lastMusic(){

if(currentListItem!=0)

{

if(--currentListItem>=0){

currentListItem=myMusicList.size();

} else{

playMusic(MUSIC_PATH+myMusicList.get(currentListItem)); }

} else{

playMusic(MUSIC_PATH+myMusicList.get(currentListItem));

}

}

//当用户返回时结束音乐并释放音乐对象

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

// TODO Auto-generated method stub

if(keyCode==KeyEvent.KEYCODE_BACK){

myMediaPlayer.stop();

myMediaPlayer.release();

this.finish();

return true;

}

return super.onKeyDown(keyCode, event);

}

//当选择列表项时播放音乐

@Override

protected void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub

currentListItem=position;

playMusic(MUSIC_PATH+myMusicList.get(currentListItem)); }

}

MusicFilter.java

package com.terry;

import java.io.File;

import java.io.FilenameFilter;

public class MusicFilter implements FilenameFilter{

@Override

public boolean accept(File dir, String filename) {

// TODO Auto-generated method stub

return (filename.endsWith(".mp3"));

}

}

viewHolder.java

package com.terry;

import android.widget.Button;

public class viewHolder {

public static Button start;

public static Button stop;

public static Button pause;

public static Button next;

public static Button last;

}

main.xml

<?xml version="1.0" encoding="utf-8"?>

<AbsoluteLayout android:id="@+id/AbsoluteLayout01"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="/apk/res/android">

<ListView

android:id="@id/android:list"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1"

android:drawSelectorOnTop="false"/>

<Button android:id="@+id/last"

android:background="@drawable/last"

android:layout_x="10px"

android:layout_y="70px"

android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

<Button android:id="@+id/stop" android:background="@drawable/stop" android:layout_x="70px"

android:layout_y="70px"

android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

<Button android:id="@+id/start"

android:layout_x="130px"

android:layout_y="70px"

android:background="@drawable/start"

android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

<Button android:id="@+id/pause" android:layout_width="wrap_content" android:layout_x="190px"

android:layout_y="70px"

android:background="@drawable/pause"

android:layout_height="wrap_content"></Button>

<Button android:id="@+id/next" android:layout_x="250px"

android:layout_y="70px" android:background="@drawable/next" android:layout_width="wrap_content"

android:layout_height="wrap_content"></Button>

</AbsoluteLayout>

res/values下strings.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="hello">Hello World, musicActivity!</string> <string name="app_name">音乐播放器</string>

</resources>

实验二十四 综合小程序(二)

【实验类型】设计性

【实验要求】必做

【实验目的】

1. 掌握综合运用前面所学知识的能力。

2. 编写一个学习图形的小游戏。

【实验内容】

实验题1.创建一个Android工程Smartbaby,活动SplashScreen.java,主要负责启动游戏,作为程序的启动界面,见图1;活动GameScreen.java,是程序的核心文件,主要负责加载游戏屏幕,实现游戏选项菜单等;类GameView.java,主要是实现游戏屏幕的绘制和游戏状态的维护;类ShapePreferences.java主要负责加载Preference文件;活动HelpScreen.java实现了程序的帮助界面;类

AudioService.java负责播放游戏的背景音乐。preference.xml位于res/xml下,music文件位于res/raw下,res/layout下有三个布局文件game_board、main、splash。游戏运行画面见图2,暂停时会弹出一个对话框,见图3。

Android应用开发基础实验指导书

图1

Android应用开发基础实验指导书

图2

Android应用开发基础实验指导书

图3

【参考程序】

GameView.java

package com.demo.total;

import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.Rect;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.os.Vibrator;

import android.util.Log;

import android.view.MotionEvent; import android.view.View;

public class GameView extends View { private String TAG;

// 游戏模式

private int mMode;

private static final int STATE_LOADING = 0; // loading for first time private static final int STATE_RUNNING = 1;

private static final int STATE_PAUSED = 2;

private int mLevel;

private boolean movingObject;

private int mBoardWidth = 1;

private int mBoardHeight = 1;

private final int WIDTH_RATIO = 7;

private Rect squareRect;

private Rect circleRect;

private Rect triangleRect;

private Rect centreRect; //

private Rect currentShapeRect;

private Rect pauseButtonRect;

private Paint squarePaint;

private Paint circlePaint;

private Paint trianglePaint;

private Paint pausePaint;

private Path trianglePath;

private int mCurrentShape;

private static final int SQUARE = 0;

private static final int CIRCLE = 1;

private static final int TRIANGLE = 2;

private static final int PAUSE = 3;

private Handler mHandler;

private Vibrator mVibrator;

private int VIBRATE_DURATION = 100;

private boolean willVibrate;

public GameView(Context context, String loggingString, Handler handler, Vibrator vibrator, boolean returning) {

super(context);

TAG = loggingString;

mHandler = handler;

mVibrator = vibrator;

if (returning) {

mMode = STATE_RUNNING;

} else {

mMode = STATE_LOADING; // we're still loading the game up (not yet

// running)

}

squarePaint = new Paint();

squarePaint.setStyle(Paint.Style.FILL);

squarePaint.setColor(Color.RED);

circlePaint = new Paint();

circlePaint.setStyle(Paint.Style.FILL);

circlePaint.setColor(Color.BLUE);

trianglePaint = new Paint();

trianglePaint.setStyle(Paint.Style.FILL);

trianglePaint.setColor(Color.YELLOW);

pausePaint = new Paint();

pausePaint.setColor(Color.WHITE);

pausePaint.setStrokeWidth((float) 5);

trianglePath = new Path();

}

public void startGame() {

mLevel = 0;

nextLevel();

mMode = STATE_RUNNING;

showBeginningAnimation();

}

private void showBeginningAnimation() {

// TODO add in some animation showing multiple shapes (can block UI)

invalidate();

}

// Move on to the next level

private void nextLevel() {

mLevel++;

mCurrentShape = Math.round((float) Math.random() * 2);

movingObject = false;

currentShapeRect = new Rect(centreRect);

sendLevel(mLevel);

}

private void sendLevel(int level) {

Message msg = mHandler.obtainMessage();

Bundle b = new Bundle();

b.putInt("level", level);

msg.setData(b);

mHandler.sendMessage(msg);

}

// User has let go of the moveable shape on something other than any other

// shape

// so just move it back to the beginning location

private void wrongShape() {

movingObject = false;

currentShapeRect.set(centreRect); // TODO: add in some animation moving shape back to centre } protected void onDraw(Canvas canvas) { drawShape(canvas, SQUARE, squareRect); drawShape(canvas, CIRCLE, circleRect); drawShape(canvas, TRIANGLE, triangleRect); drawShape(canvas, PAUSE, pauseButtonRect); if (mMode == STATE_RUNNING) { Log.d(TAG, "current shape = " + mCurrentShape); drawShape(canvas, mCurrentShape, currentShapeRect); } } // Draws "shape" on the canvas, in position rect private void drawShape(Canvas canvas, int shape, Rect rect) { switch (shape) { case SQUARE: canvas.drawRect(rect.left, rect.top, rect.right, rect.bottom, squarePaint); break; case CIRCLE: canvas.drawCircle(rect.centerX(), rect.centerY(), rect.width() / 2, circlePaint); break; case TRIANGLE: trianglePath.reset(); trianglePath.moveTo(rect.left, rect.bottom); trianglePath.lineTo(rect.right, rect.bottom); trianglePath.lineTo(rect.centerX(), rect.top); trianglePath.lineTo(rect.left, rect.bottom); trianglePath.close(); canvas.drawPath(trianglePath, trianglePaint); break; case PAUSE: int heightCoefficient = (rect.bottom - rect.top) / 5; int widthCoefficient = (rect.right - rect.left) / 3; canvas.drawLine(rect.left + widthCoefficient, rect.top + heightCoefficient, rect.left + widthCoefficient, rect.bottom - heightCoefficient, pausePaint); canvas.drawLine(rect.right - widthCoefficient, rect.top + heightCoefficient, rect.right - widthCoefficient, rect.bottom - heightCoefficient, pausePaint); break; default:

Log.d(TAG, "Shape not found (shape = " + mCurrentShape); }

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

mBoardWidth = w;

mBoardHeight = h;

// Create all the shapes here so that onDraw is as slim as possible int shapeWidth, shapeHeight;

if (mBoardHeight >= mBoardWidth) {

shapeWidth = mBoardWidth / WIDTH_RATIO;

shapeHeight = mBoardWidth / WIDTH_RATIO;

} else {

shapeWidth = mBoardHeight / WIDTH_RATIO;

shapeHeight = mBoardHeight / WIDTH_RATIO;

}

// Position of the main shapes, each represented as a rectangle squareRect = new Rect(0, 0, shapeWidth, shapeHeight);

circleRect = new Rect(0, mBoardHeight - shapeHeight, shapeWidth, mBoardHeight);

triangleRect = new Rect(mBoardWidth - shapeWidth, mBoardHeight - shapeHeight, mBoardWidth, mBoardHeight);

// Position of the shape which is moveable

centreRect = new Rect(mBoardWidth / 2 - shapeWidth / 2,

mBoardHeight

/ 2 - shapeHeight / 2, mBoardWidth / 2 + shapeWidth / 2, mBoardHeight / 2 + shapeHeight / 2);

currentShapeRect = new Rect(centreRect);

// Position of pause "button"

pauseButtonRect = new Rect(mBoardWidth - shapeWidth, 0, mBoardWidth,

shapeHeight);

if (mMode == STATE_LOADING) {

startGame(); // loading up for first time so start game

// automatically

} else {

invalidate(); // re-draw screen with changed dimensions

}

}

// User has pressed down on the screen

private void touchDown(int x, int y) {

if (currentShapeRect.contains(x, y)) {

movingObject = true;

touchMove(x, y); } } // User is dragging finger against screen private void touchMove(int x, int y) { if (movingObject) { currentShapeRect.offsetTo(x - currentShapeRect.width() / 2, y - currentShapeRect.height() / 2); } } // User has removed finger from screen private void touchUp(int x, int y) { // if landed on pause button or clicked pause button if (mMode == STATE_RUNNING) { if (pauseButtonRect.contains(x, y)) { pause(); } } else if (mMode == STATE_PAUSED) { unPause(); } // if we are moving the shape then check if we have landed on another // shape if (movingObject) { if (mCurrentShape == SQUARE) { if (Rect.intersects(currentShapeRect, squareRect)) { nextLevel(); vibratePhone(VIBRATE_DURATION); return; } } else if (mCurrentShape == CIRCLE) { if (Rect.intersects(currentShapeRect, circleRect)) { nextLevel(); vibratePhone(VIBRATE_DURATION); return; } } else if (mCurrentShape == TRIANGLE) { if (Rect.intersects(currentShapeRect, triangleRect)) { nextLevel(); vibratePhone(VIBRATE_DURATION); return; } } wrongShape(); }

} @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touchDown(x, y); invalidate(); break; case MotionEvent.ACTION_MOVE: touchMove(x, y); invalidate(); break; case MotionEvent.ACTION_UP: touchUp(x, y); invalidate(); break; } return true; } public void setWillVibrate(boolean willVibrate) { this.willVibrate = willVibrate; } private void vibratePhone(int duration) { if (willVibrate) { mVibrator.vibrate(duration); } } public void pause() { if (mMode == STATE_RUNNING) { mMode = STATE_PAUSED; movingObject = false; currentShapeRect = new Rect(centreRect); Message msg = mHandler.obtainMessage(); Bundle b = new Bundle(); b.putString("mode", "pause"); msg.setData(b); mHandler.sendMessage(msg); } } public void unPause() { mMode = STATE_RUNNING; invalidate();

}

@Override

public void onWindowFocusChanged(boolean hasWindowFocus) { // if (!hasWindowFocus) pause();

}

public Bundle saveState(Bundle map) {

if (map != null) {

map.putInt("mLevel", Integer.valueOf(mLevel));

map.putInt("mCurrentShape", Integer.valueOf(mCurrentShape)); }

return map;

}

public void restoreState(Bundle savedState) {

mLevel = savedState.getInt("mLevel");

mCurrentShape = savedState.getInt("mCurrentShape");

movingObject = false;

mMode = STATE_RUNNING;

sendLevel(mLevel);

invalidate();

}

}

GameScreen.java

package com.demo.total;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.Dialog;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.SharedPreferences;

import android.os.Handler;

import android.os.Bundle;

import android.os.Message;

import android.os.Vibrator;

import android.util.Log;

import android.view.Gravity;

import android.view.Menu;

import android.view.MenuItem;

import android.widget.LinearLayout;

import android.widget.TextView;

public class GameScreen extends Activity {

private static final int MENU_NEW_GAME = 0;

private static final int MENU_PREFERENCES = 1;

private static final int MENU_HELP = 2;

public static final int DIALOG_PAUSED = 0;

private static final int GET_PREFERENCES = 1;

private Intent intent = new Intent("com.demo.total.MUSIC");

// Logging

private static final String TAG = "GameScreen";

private GameView gameView;

private TextView levelView;

private boolean mActivityPaused;

private boolean willVibrate;

private boolean willPlayMusic;

private boolean IsPlaying = false;

SharedPreferences settings;

private Handler GUIHandler = new Handler() {

public void handleMessage(Message m) {

String mode = m.getData().getString("mode");

if (mode != null && mode.equals("pause")) {

if (!mActivityPaused) {

userPaused();

return;

}

}

int level = m.getData().getInt("level");

setLevel(levelView, level);

}

};

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setTheme(android.R.style.Theme_Black_NoTitleBar_Fullscreen); mActivityPaused = false;

Vibrator vibrator = (Vibrator)

getSystemService(Context.VIBRATOR_SERVICE);

if (savedInstanceState == null) {

// creates a new game

gameView = new GameView(this, TAG, GUIHandler, vibrator, false);

} else {

// restores previous game

gameView = new GameView(this, TAG, GUIHandler, vibrator, true);

gameView.restoreState(savedInstanceState);

}

levelView = new TextView(this);

setLevel(levelView, 0);

levelView.setTextSize((float) 20);

levelView.setWidth(android.view.ViewGroup.LayoutParams.FILL_PARENT);

levelView.setGravity(Gravity.CENTER);

LinearLayout linearLayout = new LinearLayout(this);

linearLayout.setOrientation(LinearLayout.VERTICAL);

setContentView(linearLayout);

linearLayout.addView(levelView);

linearLayout.addView(gameView);

// Preferences

SharedPreferences spc = this.getSharedPreferences(

"com.demo.total.shapes_preferences",

MODE_WORLD_WRITEABLE);

willVibrate = spc.getBoolean("vibrate_preference", false);

gameView.setWillVibrate(willVibrate);

willPlayMusic = spc.getBoolean("music_preference", false);

// 开启背景音乐

if (willPlayMusic) {

Log.i(TAG, "i will play music");

startService(intent);

IsPlaying = true;

}

}

private void setLevel(TextView view, int lev) {

view.setText("Score: " + lev);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

menu.add(Menu.NONE, MENU_NEW_GAME, Menu.NONE, R.string.menu_new_game);

menu.add(Menu.NONE, MENU_PREFERENCES, Menu.NONE, R.string.menu_preferences);

menu.add(Menu.NONE, MENU_HELP, Menu.NONE,

R.string.menu_help);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

Intent launchPreferencesIntent;

switch (item.getItemId()) {

case MENU_NEW_GAME:

gameView.startGame();

return true;

case MENU_PREFERENCES:

launchPreferencesIntent = new Intent().setClass(this,

ShapePreferences.class);

startActivityForResult(launchPreferencesIntent,

GET_PREFERENCES);

return true;

case MENU_HELP:

launchPreferencesIntent = new Intent().setClass(this,

HelpScreen.class);

startActivity(launchPreferencesIntent);

return true;

}

return false;

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == GET_PREFERENCES) {

// settings = getPreferences(MODE_PRIVATE);

SharedPreferences settings = this.getSharedPreferences( "com.demo.total_preferences",

MODE_WORLD_WRITEABLE);

willVibrate = settings.getBoolean("vibrate_preference", false); gameView.setWillVibrate(willVibrate);

// 对是否播放音乐判断

willPlayMusic = settings.getBoolean("music_preference", false); if (!willPlayMusic && IsPlaying) {

stopService(intent);

IsPlaying = false;

} else if (willPlayMusic && !IsPlaying) {

startService(intent);

IsPlaying = true;

}

}

}

@Override

protected Dialog onCreateDialog(int id) {

switch (id) {

case DIALOG_PAUSED:

AlertDialog.Builder pausedDialogBuilder = new

AlertDialog.Builder(

this);

} pausedDialogBuilder.setMessage("Game is paused."); pausedDialogBuilder.setPositiveButton("unpause", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { gameView.unPause(); } }); return (Dialog) pausedDialogBuilder.create(); } return null; } public void userPaused() { showDialog(DIALOG_PAUSED); } // Activity loses focus. @Override protected void onPause() { super.onPause(); mActivityPaused = true; gameView.pause(); // pause game when Activity pauses // 关闭背景音乐 if (IsPlaying) { stopService(intent); IsPlaying = false; } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); gameView.saveState(outState); } @Override protected void onRestoreInstanceState(Bundle inState) { super.onRestoreInstanceState(inState); gameView.restoreState(inState); mActivityPaused = false; }

更多相关推荐:
android本科实验报告

本科实验报告课程名称实验项目实验地点专业班级学生姓名指导教师Android设计与开发Android课程实验学号年月日太原理工大学学生实验报告太原理工大学学生实验报告太原理工大学学生实验报告太原理工大学学生实验报...

Android实训实验报告

报告编号第5组综合课程设计报告基于Android平台的记事本的设计与实现学生姓名指导教师所在系电子工程系所学专业计算机科学与技术班级20xx年12月摘要基于Android平台的记事本的设计与实现随着科学技术的不...

Android实验报告

实验报告课程名称手机应用开发实验名称Android实验院系信息与控制工程学院专业班级姓名学号指导教师20xx年月日实验一一实验名称Android开发环境搭建与Helloworld二主要实验仪器及套数计算机一台W...

Android编程基础 实验报告三

南昌航空大学实验报告二0一三年一月六日课程名称移动终端编程技术实验名称Android组件通信和后台服务班级姓名同组人指导教师评定签名一实验目的了解使用Intent进行组件通信的原理掌握使用Intent启动Act...

Android实验报告模板_实验四

Android实验报告模板_实验四,内容附图。

android实验报告模板(新)

移动互联网开发Android实验报告姓名万思学号专业指导老师张华完成日期20xx1116目录实验一Android开发环境的搭建41实验目的及要求42实验设备环境及要求43实验内容44实验步骤55实验核心代码关键...

android开发音乐盒的实验报告

开发一个安卓软件报告报告设计题目用安卓开发单机音乐盒学院名称电子与信息工程学院专业计算机科学与技术班级计科091姓名学号03指导教师定稿日期20xx年12月26日一设计任务与要求1设计目标1了解Java编程的基...

android布局实验报告

Java网络编程实验实验题目Java基于JDBC的数据库应用指导老师吴学辉班级计算机科学与技术系1202班姓名范婧20xx100232一实验目的1了解JDBCODBC工作原理2掌握JDBCODBC桥接驱动程序3...

Android 实验

实验一Android开发环境搭建11实验目的学习安装配置测试Android开发环境学习创建Android项目及其在模拟器上的运行和调试以及Android应用程序的安装12实验内容1了解Android开发所需要的...

Android应用开发基础教学计划与教案-实验指导

目录实验内容2实验一熟悉Android环境2实验二Activity组件的生命周期7实验三界面布局的创建9实验四熟悉布局类10实验五资源管理14实验六intent的调用16实验七实现Activity之间的协同19...

学号-姓名-实验9 Android应用资源的使用

实验报告封面课程名称Android平台开发与应用课程代码SM3004任课老师梁郁君实验指导老师梁郁君实验报告名称实验9Android应用资源的使用学生姓名学号教学班递交日期签收人我申明本报告内的实验已按要求完成...

Android专业可行性报告

简介与发展历程一Android简介与发展历程1Android简介Android是Google历经数年和投资数亿美元开发出来的智能手机系统是基于Linux内核的操作系统是Google公司在20xx年11月5日公布...

android实验报告(26篇)