1 控件和基本事件的响应
2 键盘事件的响应
3 运动事件的处理
4 屏幕间的跳转和事件的传递
5 菜单的使用
6 弹出对话框
7 样式的设置
1 控件和基本事件的响应
对于Android的应用程序,UI元素(通常称之为控件,在Android中称之为View)是其构建UI的基础。
相关的两个要点:
? 1〉如何得到xml中的控件的句柄
? 2〉如何设置控件的行为
控制程序的3种实现方式:
public class TestEvent1 extends Activity {
private static final String TAG ="TestEvent1";
public TestEvent1() {
}
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testevent);
final TextView Text = (TextView)findViewById(R.id.text1);
final Button Button1 = (Button)findViewById(R.id.button1);
final Button Button2 = (Button)findViewById(R.id.button2);
Button1.setOnClickListener(newOnClickListener() {
public void onClick(View v) {
Text.setBackgroundColor(Color.RED);
}
} );
Button2.setOnClickListener(newOnClickListener() {
public void onClick(View v) {
Text.setBackgroundColor(Color.GREEN);
}
} );
}
}
public class TestEvent2 extends Activityimplements OnClickListener {
private static final String TAG ="TestEvent2";
private TextView mText;
private Button mButton1;
private Button mButton2;
public TestEvent2() { }
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testevent);
mText = (TextView)findViewById(R.id.text1);
mButton1 = (Button)findViewById(R.id.button1);
mButton1.setOnClickListener(this); // 设置监听的类
mButton2 = (Button)findViewById(R.id.button2);
mButton2.setOnClickListener(this); // 设置监听的类
}
public void onClick(View v) {
Log.v(TAG, "onClick()");
switch(v.getId()){ // 区分不同的控件
case R.id.button1:
mText.setBackgroundColor(Color.RED);
break;
case R.id.button2:
mText.setBackgroundColor(Color.GREEN);
break;
default:
break;
}
}
}
public class TestEvent3 extends Activity{
private static final String TAG ="TestEvent3";
private TextView mText;
private Button1_OnClickListener mListener1= new
Button1_OnClickListener();
private Button2_OnClickListener mListener2= new
Button2_OnClickListener();
public TestEvent3() {
}
class Button1_OnClickListener implementsOnClickListener {
public void onClick(View v) {
mText.setBackgroundColor(Color.RED);
}
}
class Button2_OnClickListener implementsOnClickListener {
public void onClick(View v) {
mText.setBackgroundColor(Color.GREEN);
}
}
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testevent);
mText = (TextView)findViewById(R.id.text1);
final Button mButton1 = (Button) findViewById(R.id.button1);
final Button mButton2 = (Button)findViewById(R.id.button2);
mButton1.setOnClickListener(mListener1);// 设置监听者的类
mButton2.setOnClickListener(mListener2);// 设置监听者的类
}
}
要点:
? 使用findViewById获取XML中UI元素的句柄
? 使用setOnXXXListener()设置事件处理函数
setOnClickListener是类android.view.View类的函数,每一个UI元素都继承的这个类,同族的函数包
括:
voidsetOnClickListener(View.OnClickListener l);
voidsetOnCreateContextMenuListener(View.OnCreateContextMenuListener l);
voidsetOnFocusChangeListener(View.OnFocusChangeListener l);
void setOnKeyListener(View.OnKeyListenerl);
voidsetOnLongClickListener(View.OnLongClickListener l);
voidsetOnTouchListener(View.OnTouchListener l);
2 键盘事件的响应
在应用的程序的控制方面,更多的使用的是屏幕上的控件,但是有的时候也需要直
接对键盘事件来进行响应。键盘是Android中主要的输入设备,对按键的响应的处理是响应之间在程序中使用键盘的核心内容。
按键信息:
按键码、按键的动作(抬起、按下)、重复信息、扫描码。
[img,500,59]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/X6EN%7D7T8S_1NOVVU79A5(OQ.jpg[/img]
使用上键和右键增加图片的Alpha值,使用下键和左键减少图片的Alpha值
布局文件:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/screen"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextViewandroid:id="@+id/alphavalue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
<ImageViewandroid:id="@+id/image"
android:src="@drawable/robot"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
代码:
package com.android.basicapp;
import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.ImageView;
public class TestKeyEvent extends Activity{
private static final String TAG ="TestKeyEvent";
private ImageView mImage;
private TextView mAlphavalueText;
private int mAlphavalue;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.testkeyevent);
mImage = (ImageView)findViewById(R.id.image);
mAlphavalueText = (TextView)findViewById(R.id.alphavalue);
mAlphavalue = 100;
mImage.setAlpha(mAlphavalue);
mAlphavalueText.setText("Alpha =" + mAlphavalue*100/0xff + "%");
}
@Override
public boolean onKeyDown(int keyCode,KeyEvent msg){
Log.v(TAG, "onKeyDown: keyCode ="+ keyCode);
Log.v(TAG, "onKeyDown: String =" + msg.toString());
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_RIGHT:
mAlphavalue += 20;
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_DPAD_LEFT:
mAlphavalue -= 20;
break;
default:
break;
}
if(mAlphavalue>=0xFF)mAlphavalue =0xFF;
if(mAlphavalue<=0x0)mAlphavalue = 0x0;
mImage.setAlpha(mAlphavalue);
mAlphavalueText.setText("Alpha =" + mAlphavalue*100/0xff + "%");
return super.onKeyDown(keyCode, msg);
}
}
onKeyDown()函数来获得按键的事件,同类的函数还包括onKeyUp()函数,其参数intkeyCode为按键码,KeyEvent msg表示按键
事件的消息(其中包含了更详细的内容)。
KeyEvent主要包含以下一些接口:
final int getAction() // 获得按键的动作
final int getFlags() // 获得标志
final int getKeyCode() // 获得按键码
final int getRepeatCount() // 获得重复的信息
final int getScanCode() // 获得扫描码
3 运动事件的处理
触摸屏(TouchScreen )和滚动球(TrackBall )是Android中除了键盘之外的主要输入设备。如果需要使用触摸屏和滚动球,主要可以通过使用运动事件(MotionEvent )用于接收它们的信息。 触摸屏和滚动球事件主要通过实现以下2个函数来接收:
public boolean onTouchEvent(MotionEventevent)
public booleanonTrackballEvent(MotionEvent event)
显示当前的MotionEvent 的动作和位置
[img,500,90]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/Y6A5B_%25~71%5BIGG1N6N1Z(%60L.jpg[/img]布局文件:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"android:layout_height="fill_parent"
android:orientation="vertical">
<TextViewandroid:id="@+id/action"
android:textSize = "20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextViewandroid:id="@+id/postion"
android:textSize = "20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
源代码文件:
package com.android.basicapp;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;
public class TestMotionEvent extendsActivity {
private static final String TAG ="TestMotionEvent";
TextView mAction;
TextView mPostion;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.testmotionevent);
mAction =(TextView)findViewById(R.id.action);
mPostion =(TextView)findViewById(R.id.postion);
}
@Override
public boolean onTouchEvent(MotionEventevent) {
int Action = event.getAction();
float X = event.getX();
float Y = event.getY();
mAction.setText("Action = "+Action);
mPostion.setText("Postion =("+X+","+Y+")");
return true;
}
}
MotionEvent 是用于处理运动事件的类,这个类中可以获得动作的类型、动作的坐标。 在Android 2.0 版本之后,MotionEvent 中还包含了多点触摸的信息,当有多个触点同时起作用的时候,可以获得触点的数目和每一个触点的坐标。
4 屏幕间的跳转和事件的传递
Android的每一个屏幕基本就是一个活动(Activity)。在屏幕之间的切换事实上就是在活动间互相调用的的
过程,Android使用Intent完成这个动作。
[img,750,50]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/3RVH@VB4CC(PX%606U%25WQG0NO.jpg[/img]
示例程序:Forward
(ApiDemo =>App=>Activity=>Forward)
源文件:
com/example/android/apis/app/Forward.java
com/example/android/apis/app/ForwardTarget.java
布局资源文件:
forward_target.xml
forwarding.xml
<activity android:name=“.app.Forwarding"android:label="@string/activity_forwarding">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
<activity android:name=“.app.ForwardTarget">
</activity>
[img,750,61]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/3V4(~%7D2AJ7U%60GQ)0G%7BU9%7BBC.jpg[/img]
JAVA源文件Forward.java:
public void onClick(View v)
{.
Intent intent = new Intent();
intent.setClass(Forwarding.this,ForwardTarget.class);
startActivity(intent);
finish();
}
知识点:
Intent是Android类的子类,用于启动活
动,服务或者消息接收器。
示例程序:ReceiveResult
(ApiDemo =>App=>Activity=>ReceiveResult )
源文件:
com/example/android/apis/app/ReceiveResult.java
com/example/android/apis/app/SendResult.java
布局资源文件:
receive_result.xml
send_result.xml
<activityandroid:name=".app.ReceiveResult"
android:label="@string/activity_receive_result">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
<activityandroid:name=".app.SendResult">
</activity>
[img,750,46]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/BP76W9%60%5DMR%5D_T6QLPA5~I%5BN.jpg[/img]
JAVA源文件ReceiveResult.java:
static final private int GET_CODE = 0;
private OnClickListener mGetListener = newOnClickListener() {
public void onClick(View v) {
Intent intent = newIntent(ReceiveResult.this, SendResult.class);
startActivityForResult (intent, GET_CODE);
}
};
JAVA源文件SendResult.java:
public void onClick(View v)
{
setResult (RESULT_OK, (newIntent()).setAction("Corky!"));
finish();
}
5 菜单的使用
菜单是屏幕中比较独立的一个元素,它和普通的控件略有不同,很多GUI系统都对菜单有单独的接口和运作方式。 在Android中具有单独接口,用于在活动中使用菜单。菜单的相关接口:
public boolean onCreateOptionsMenu(Menumenu)
public booleanonOptionsItemSelected(MenuItem item)
[img,750,61]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/Z%25FGMEFAY3924%7B8%7BLQA3L%7DF.jpg[/img]
使用一个菜单来控制按钮的背景颜色
JAVA源文件ReceiveResult.java:
package com.android.basicapp;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.graphics.Color;
import android.view.View;
import android.view.Menu;
import android.view.Gravity;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;
import android.util.Log;
public class TestMenu extends Activity {
private static final String TAG ="TestMenu";
private Button mButton;
public static final int RED_MENU_ID =Menu.FIRST;
public static final int GREEN_MENU_ID =Menu.FIRST + 1;
public static final int BLUE_MENU_ID =Menu.FIRST + 2;
public TestMenu() { }
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testmenu);
mButton = (Button)findViewById(R.id.color_button);
}
@Override
public boolean onCreateOptionsMenu(Menumenu) {
super.onCreateOptionsMenu(menu);
menu.add(0, RED_MENU_ID, 0, R.string.red);
menu.add(0, GREEN_MENU_ID, 0,R.string.green);
menu.add(0, BLUE_MENU_ID, 0,R.string.blue);
return true;
}
@Override
public booleanonOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case RED_MENU_ID:
mButton.setBackgroundColor(Color.RED);
mButton.setText(R.string.red);
return true;
case GREEN_MENU_ID:
mButton.setBackgroundColor(Color.GREEN);
mButton.setText(R.string.green);
return true;
case BLUE_MENU_ID:
mButton.setBackgroundColor(Color.BLUE);
mButton.setText(R.string.blue);
return true;
}
return super.onOptionsItemSelected(item);
}
}
6 弹出对话框
弹出式对话框不同于一个活动,它通常用于简单的功能。 对话框的父类是ndroid.app.Dialog,通过构建类android.app.AlertDialog来实现弹出式对话框,可以使用AlertDialog.Builder和不同的参数来构建对话框。菜单也Android的GUI中可以灵活使用元素,类为android.view.Menu
对话框示例程序:
(ApiDemo =>App=>Dialog )
源文件:
com/example/android/apis/app/AlertDialogSamples.java
布局资源文件:
alert_dialog.xml
<activityandroid:name=".app.AlertDialogSamples"
android:label="@string/activity_alert_dialog">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
[img,750,58]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/%5DZ%2551%5DR%7DVL6)3@$JO%7D8M%7DG8.jpg[/img]
[img,750,45]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/7VV%7B4UL(OANN@AX%60NU_~XA8.jpg[/img]
[img,750,48]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/IHI%25V5J4KJIJLKIVJ$4QG0X.jpg[/img]
对话框的类为android.app.Dialog,通过android.app.AlertDialog.Builder类来建立,在建立的过程中可以进行多项设置。
?? setIcon()和setTitle():用于设置图标和标题;
?? setMessage():用于设置提示信息;
?? setPositiveButton()、setNeutralButton()和setNegativeButton():用于设置左、中、右按钮;
?? setSingleChoiceItems()和setMultiChoiceItems():用于设置单选项和复选项;
?? setView():用于设置一个View作为对话框的内容。
AlertDialog.Builder的各个函数的返回类型均为droid.app.AlertDialog.Builder,也就是这个类本身,因此可以使用如下的方式进行连续调用来设置更多的内容。
以上的各个函数设置完成后调用create()函数返回android.app.AlertDialog类,这个类表示一个可以使用的对话框。
7 样式的设置
通过在AndroidManifest.xml中设置样式,也可以控制活动的外观。所设置的样式可以基于预定的样式,也可以自定义样式。预定的样式在framework中定义,自定义样式在应用程序中定义。
示例程序:
DialogActivity 和CustomDialogActivity
源文件:
com/example/android/apis/app/DialogActivity.java
com/example/android/apis/app/CustomDialogActivity.java
样式文件:
values/styles.xml
<stylename="Theme.CustomDialog"parent="android:style/Theme.Dialog">
<itemname="android:windowBackground">@drawable/filled_box</item>
</style>
AndroidManifest.xml
<activity android:name=".app.DialogActivity"
android:label="@string/activity_dialog"
android:theme="@android:style/Theme.Dialog“>
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
<activityandroid:name=".app.CustomDialogActivity"
android:label="@string/activity_custom_dialog"
android:theme="@style/Theme.CustomDialog“>
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAMPLE_CODE"/>
</intent-filter>
</activity>
[img,750,59]file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/QQ/Temp/RichOle/1RJO%7D%7D3_O@%25MH7F8~)(%60%7DJC.jpg[/img]
示例程序:
TranslucentActivity 和TranslucentBlurActivity
源文件:
com/example/android/apis/app/TranslucentActivity.java
com/example/android/apis/app/TranslucentBlurActivity.java
样式文件:
values/styles.xml
<stylename="Theme.Transparent">
<itemname="android:windowIsTranslucent">true</item>
<itemname="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
<itemname="android:windowBackground">@drawable/transparent_background</item>
<itemname="android:windowNoTitle">true</item>
<itemname="android:colorForeground">#fff</item>
</style>
AndroidManifest.xml
<activityandroid:name=".app.TranslucentActivity"
android:label="@string/activity_translucent"
android:theme="@style/Theme.Translucent“>
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAMPLE_CODE"/>
</intent-filter>
</activity>
<activityandroid:name=".app.TranslucentBlurActivity"
android:label="@string/activity_translucent_blur"
android:theme="@style/Theme.Transparent“>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
TranslucentBlurActivity.java
public class TranslucentBlurActivityextends Activity {
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
getWindow().
setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
setContentView(R.layout.translucent_background);
}
}