第3章、事件监听器
3.1 基本概念
一、在Android 应用开发过程中,常用监听事件如下:
(1) ListView事件监听
setOn ItemSelectedListener:鼠标滚动时触发
setOnItemClickListener: 点击时触发
(2 )EditText 事件监听
setOnKeyListener: 获取焦点时触发
(3) RadioGroup事件监听
setOnCheckedChangeListener: 点击时触发
(4) CheckBox事件监听
setOnCheckedChangeListener :点击时触发
(5 )Spinner事件监听
setOnltemSelectedListener:点击时触发
(6) DatePicker 事件监听
onDateChangedListener: 日期改变时触发
(7 )DatePickerDialog 事件监听
onDateSetListener:设置日期时触发
(8) TimePicker 事件监听
onTimeChangedListener:时间改变时触发
(9 )TimePickerDialog 事件监听
onTimeSetListener: 设置时间时触发
(10)Button. ImageButton 事件监听
setOnClickListener: 点击时触发
(11)Menu 事件监听
onOptionsltemSelected; 点击时触发
(12 )Gallery 事件监听
setOnItemClickListener: 点击时触发
(13 )GridView 事件监听
setOnltemClickListener: 点击时触发
二、实现事件监听器的方法:
- 内部类形式
- 匿名内部类形式
- 外部类形式
- Activity本身作为事件监听器类
- 直接绑定到标签
三、事件监听三要素
1、事件源
2、监听器
3、事件处理器
3.2 监听实例
设置字体加粗:test.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
设置字体倾斜:(对英文有效,中文倾斜需要使用Paint类或者样式实现):test.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC));
一、使用内部类的方式:
MainActivity.java中的代码:
package com.example.demo2;
import android.os.Bundle;
import android.app.Activity;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
//1、内部类作为事件监听器
public class MainActivity extends Activity {
MyListener myListener = new MyListener();
MyListener2 myListener2 = new MyListener2();
// 1、定义变量
private Button red, blue, green, bigger, smaller;
private TextView test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 2、变量关联布局控件
red = (Button) findViewById(R.id.red); // 关联布局文件中的控件
blue = (Button) findViewById(R.id.blue);
green = (Button) findViewById(R.id.green);
bigger = (Button) findViewById(R.id.bigger);
smaller = (Button) findViewById(R.id.smaller);
test = (TextView) findViewById(R.id.test);
red.setOnClickListener(myListener);// 1、事件源添加事件监听
blue.setOnClickListener(myListener);// 1、事件源添加事件监听
green.setOnClickListener(myListener);// 1、事件源添加事件监听
bigger.setOnClickListener(myListener2);// 1、事件源添加事件监听
smaller.setOnClickListener(myListener2);// 1、事件源添加事件监听
}
private class MyListener implements OnClickListener { // 3、监听器
@Override
public void onClick(View v) { // 2、事件处理器
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.red:
test.setTextColor(Color.RED);
break;
case R.id.blue:
test.setTextColor(Color.BLUE);
break;
case R.id.green:
test.setTextColor(Color.GREEN);
break;
default:
break;
}
}
}
private class MyListener2 implements OnClickListener { // 3、监听器
private int size=12;
@Override
public void onClick(View v) { // 2、事件处理器
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.bigger:
size=(int) test.getTextSize();//获取当前字体的大小并转换成整数后赋值给变量 n
size+=4;
break;
case R.id.smaller:
size=(int) test.getTextSize();//获取当前字体的大小并转换成整数后赋值给变量 n
size-=4;
break;
default:
break;
}
if(size>72){
size=72;
}
else if(size<8){
size=8;
}
test.setTextSize(size);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
布局管理文件代码为:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/test" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/color" />
<Button
android:id="@+id/red"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/red" />
<Button
android:id="@+id/green"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/green" />
<Button
android:id="@+id/blue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/blue" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/size" />
<Button
android:id="@+id/bigger"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bigger" />
<Button
android:id="@+id/smaller"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/smaller" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/style" />
<Button
android:id="@+id/bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bold" />
<Button
android:id="@+id/itatic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/itatic" />
<Button
android:id="@+id/normal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/normal" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/content" />
<EditText
android:id="@+id/content"
android:layout_width="200dp"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
String.xml文件代码:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">EditTest</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="test">测试文字,测试文字!</string>
<string name="color">颜色</string>
<string name="red">红色</string>
<string name="green">绿色</string>
<string name="blue">蓝色</string>
<string name="size">大小</string>
<string name="bigger">增大</string>
<string name="smaller">缩小</string>
<string name="style">样式</string>
<string name="bold">加粗</string>
<string name="itatic">倾斜</string>
<string name="normal">正常</string>
<string name="content">内容</string>
</resources>
二、外部类实现
1、新建工程文件
2、布局管理文件和内部类一样(复制上面代码);
3、Strings.xml文件和内部类一样(复制上面代码);
4、在同一个包下建立外部类OutterListener .java,代码如下:
import android.graphics.Color;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
//事件监听器
public class OutterListener implements OnClickListener {
private TextView test;
private int size = 12;
OutterListener(TextView textView) {
this.test = textView;
}
//事件处理器
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.red:
test.setTextColor(Color.RED);
break;
case R.id.green:
test.setTextColor(Color.GREEN);
break;
case R.id.blue:
test.setTextColor(Color.BLUE);
case R.id.bigger:
size = (int) test.getTextSize();
size += 4;
break;
case R.id.smaller:
size = (int) test.getTextSize();
size -= 4;
break;
default:
break;
}
if (size >= 72) {
size = 72;
}
if (size <= 8) {
size = 8;
}
test.setTextSize(size);
}
}
5、MainActivity.java中的代码:
public class MainActivity extends Activity {
private Button red, green, blue, smaller, bigger;
private TextView test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//关联到布局文件
red = (Button) findViewById(R.id.red);
green = (Button) findViewById(R.id.green);
blue = (Button) findViewById(R.id.blue);
bigger = (Button) findViewById(R.id.bigger);
smaller = (Button) findViewById(R.id.smaller);
test = (TextView) findViewById(R.id.test);
//外部类作为事件监听器
OutterListener outterListener = new OutterListener(test);
//对事件源进行事件的监听
red.setOnClickListener(outterListener);
green.setOnClickListener(outterListener);
blue.setOnClickListener(outterListener);
bigger.setOnClickListener(outterListener);
smaller.setOnClickListener(outterListener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
三、内部来实现颜色变化,外部类实现字体大小的变化(混合使用)
1、新建工程文件
2、布局管理文件和内部类一样(复制上面代码);
3、Strings.xml文件和内部类一样(复制上面代码);
4、在同一个包下建立外部类OutterListener .java,代码如下:
package iet.jxufe.cn.android;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class OutterListener implements OnClickListener {
private TextView test;
private int size = 12;
OutterListener(TextView textView) {
this.test = textView;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bigger:
size = (int) test.getTextSize();
size += 4;
break;
case R.id.smaller:
size = (int) test.getTextSize();
size -= 4;
break;
default:
break;
}
if (size >= 72) {
size = 72;
}
if (size <= 8) {
size = 8;
}
test.setTextSize(size);
}
}
5、MainActivity.java中的代码:
package iet.jxufe.cn.android;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
MyListener myListener = new MyListener();
private Button red, green, blue,smaller,bigger;
private TextView test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
red = (Button) findViewById(R.id.red);
green = (Button) findViewById(R.id.green);
blue = (Button) findViewById(R.id.blue);
red.setOnClickListener(myListener);
green.setOnClickListener(myListener);
blue.setOnClickListener(myListener);
test = (TextView) findViewById(R.id.test);
bigger = (Button) findViewById(R.id.bigger);
smaller = (Button) findViewById(R.id.smaller);
OutterListener outterListener=new OutterListener(test);
bigger.setOnClickListener(outterListener);
smaller.setOnClickListener(outterListener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class MyListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.red:
test.setTextColor(Color.RED);
break;
case R.id.green:
test.setTextColor(Color.GREEN);
break;
case R.id.blue:
test.setTextColor(Color.BLUE);
break;
default:
break;
}
}
}
}
四、匿名内部类实现
1、新建工程文件
2、布局管理文件和内部类一样(复制上面代码);
3、Strings.xml文件和内部类一样(复制上面代码);
4、MainActivity.java中的代码如下:
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button red, blue, green, bigger, smaller,bold,itatic,normal;
private TextView test;
private int size = 12;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
red = (Button) findViewById(R.id.red);
blue = (Button) findViewById(R.id.blue);
green = (Button) findViewById(R.id.green);
bigger = (Button) findViewById(R.id.bigger);
smaller = (Button) findViewById(R.id.smaller);
bold = (Button) findViewById(R.id.bold);
itatic = (Button) findViewById(R.id.itatic);
normal = (Button) findViewById(R.id.normal);
test = (TextView) findViewById(R.id.test);
// 匿名内部类实现对事件的监听
red.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
test.setTextColor(Color.RED);
}
});
blue.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
test.setTextColor(Color.BLUE);
}
});
green.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
test.setTextColor(Color.GREEN);
}
});
bigger.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
size = (int) test.getTextSize();
size += 4;
if (size >= 72) {
size = 72;
}
test.setTextSize(size);
}
});
smaller.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
size = (int) test.getTextSize();
size -= 4;
if (size <= 8) {
size = 8;
}
test.setTextSize(size);
}
});
bold.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
test.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
}
});
itatic.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
test.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC));
}
});
normal.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
test.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
五、MainActivity类作为事件监听器
1、新建工程文件
2、布局管理文件和内部类一样(复制上面代码);
3、Strings.xml文件和内部类一样(复制上面代码);
4、MainActivity.java中的代码如下:
package com.example.demo5;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private Button red, blue, green, bigger, smaller, bold, itatic, normal;
private TextView test;
private int size = 12;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
red = (Button) findViewById(R.id.red);
blue = (Button) findViewById(R.id.blue);
green = (Button) findViewById(R.id.green);
bigger = (Button) findViewById(R.id.bigger);
smaller = (Button) findViewById(R.id.smaller);
bold = (Button) findViewById(R.id.bold);
itatic = (Button) findViewById(R.id.itatic);
normal = (Button) findViewById(R.id.normal);
test = (TextView) findViewById(R.id.test);
red.setOnClickListener(this);// 对事件源进行事件监听
blue.setOnClickListener(this);// 对事件源进行事件监听
green.setOnClickListener(this);// 对事件源进行事件监听
bigger.setOnClickListener(this);// 对事件源进行事件监听
smaller.setOnClickListener(this);// 对事件源进行事件监听
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.red:
test.setTextColor(Color.RED);
break;
case R.id.blue:
test.setTextColor(Color.BLUE);
break;
case R.id.green:
test.setTextColor(Color.GREEN);
break;
case R.id.bigger:
size=(int) test.getTextSize();
size+=4;
if(size>48){
size=48;
}
test.setTextSize(size);
break;
case R.id.smaller:
size=(int) test.getTextSize();
size-=4;
if(size<8){
size=8;
}
test.setTextSize(size);
break;
default:
break;
}
}
}
六、混合使用案例:
1、activity_main中的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/button1"
android:text="接口方式设置监听器"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button2"
android:text="直接在xml文件中绑定"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="button2OnClick"/>
<Button
android:id="@+id/button3"
android:text="使用匿名内部类设置监听器"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button4"
android:text="使用外部类设置监听器"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
2、MainActivity中的代码如下:
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Context context = MainActivity.this;
private Button button1;
private Button button2;
private Button button3;
private Button button4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button4 = (Button) findViewById(R.id.button4);
button1.setOnClickListener(this);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context,"使用匿名内部类实现监听", Toast.LENGTH_SHORT).show();
}
});
button4.setOnClickListener(new MyOnClickListener() {
public void onClick(View view){
super.onClick(view);
}
});
}
public void button2OnClick(View view){
Toast.makeText(context,"直接在xml文件中绑定", Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button1:
Toast.makeText(context,"以接口的方式设置监听器", Toast.LENGTH_SHORT).show();
break;
}
}
class MyOnClickListener implements View.OnClickListener{
@Override
public void onClick(View view) {
Toast.makeText(context,"使用外部类设置监听器", Toast.LENGTH_SHORT).show();
}
}
}