1. 事件处理简介
1.1 知识点
(1)了解事件处理的作用;
(2)了解常用的事件及相关处理接口;
1.2 具体内容
在android当中,基本上每一个组件都有用相应的事件处理,但是不过有多少种事件多少个组件,事件操作的流程都是一致的,事件处理需要一个事件源,事件源包含本身触发事件的组件以及事件的类型这两个关键信息。那么每触发一个事件,都需要有一个相应的监听来进行处理。
package com.example.eventlistenerproject;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class EventListenerActivity extends Activity {
Button but = null;
EditText edt = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_listener);
but = (Button)super.findViewById(R.id.but);
edt = (EditText)super.findViewById(R.id.edt);
but.setOnClickListener(new OnClickListenerImpl());
}
class OnClickListenerImpl implements OnClickListener{
@Override
public void onClick(View v) {
edt.setText("按钮被点击了");
}}
}
以上是使用声明内部类的形式,我们达到了注册单击事件的效果。
使用匿名内部类:
package com.example.eventlistenerproject;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class EventListenerActivity extends Activity {
Button but = null;
EditText edt = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_listener);
but = (Button)super.findViewById(R.id.but);
edt = (EditText)super.findViewById(R.id.edt);
but.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
edt.setText("按钮被点击了,这次是使用的匿名内部类");
}
});
}
}
同时也可以直接在布局文件当中去进行注册,相应的只需要在Activity当中去声明一个与其注册的方法名相同的事件处理方法就可以了(需要注意的是,该方法同样需要有一个View对象作为参数)。
1.3 小结
事件处理的核心在于如下操作:
(1)注册监听程序;
(2)根据指定的事件编写指定的处理程序;
(3)在事件处理类之中完成事件的处理操作。
2. 单击事件
2.1 知识点
(1)掌握单击事件的使用及处理;
(2)使用单击事件完成常见操作程序的开发。
2.2 具体内容
处理单击事件的处理接口是OnClickListener,里面需要覆写的方法是OnClick方法。
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".OnClickActivity" >
<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示输入的内容"
/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
package com.example.onclickproject;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class OnClickActivity extends Activity {
EditText edt = null;
TextView tv = null;
Button but = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_on_click);
this.edt = (EditText) super.findViewById(R.id.edt);
this.but = (Button) super.findViewById(R.id.but);
this.tv = (TextView) super.findViewById(R.id.tv);
this.but.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String inputText = edt.getText().toString();//取得文本输入的内容
tv.setText(inputText);
}
});
}
}
以上的程序完成功能就是讲EditText当中输入的内容显示到TextView当中,在这里我们再次回顾单击事件的处理过程。
2.3 小结
(1)单击事件为View本身所定义的一种常见事件;
(2)在使用单击事件可以使用内部类或者是匿名内部类的方式进行事件处理。
3. 单选钮与OnCheckedChangeListener
3.1 知识点
(1)使用单选钮中的选项改变事件进行操作。
3.2 具体内容
范例:将用户选择的单选选项的值放到TextView去显示
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".OnCheckedChangeListenerActivity" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请选择性别:" />
<RadioGroup
android:id="@+id/rg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:checkedButton="@+id/male"
>
<RadioButton
android:id="@+id/male"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="男"
/>
<RadioButton
android:id="@+id/female"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="女"
/>
</RadioGroup>
</LinearLayout>
package com.example.oncheckedchangerlistenerproject;
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 OnCheckedChangeListenerActivity extends Activity {
RadioGroup rg = null;
RadioButton male =null;
RadioButton female = null;
TextView tv =null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_on_checked_change_listener);
rg = (RadioGroup) super.findViewById(R.id.rg);
male = (RadioButton) super.findViewById(R.id.male);
female = (RadioButton) super.findViewById(R.id.female);
tv = (TextView) super.findViewById(R.id.tv);
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
String str = null;
if(male.getId()==checkedId){
tv.setText("选中的性别是男");
}else{
tv.setText("选中的性别是女");
}
}
});
}
}
这里如果选项存在多个的话,那么判断需要进行多次。
内部类注册监听与匿名内部类注册监听的区别:最明显的区别就是看这个事件是否只执行一次。
如果说一个Activity当中存在多个同种类型的事件监听,那么我们使用内部类注册,就可以在多做事件源判断的基础上将这些监听进行统一的注册,在这种情况下,使用内部类明显是更合适的可以节约代码同时也能让代码更便于阅读。如果仅仅是单个事件(只是用一次的监听)那么我们可以选择匿名内部类。
3.3 小结
(1)OnCheckedChange事件可以用于选项改变时进行监听,使用.
(2)OnCheckedChangeListener接口可以完成事件的监听处理。
4. 下拉列表框与OnItemSelectedListener
4.1 知识点
(1)使用事件监听实现对Spinner组件的操作;
(2)完成级联菜单的开发。
4.2 具体内容
下拉列表有一下一些监听操作,对应的监听注册方法有:
·单击选项:setOnItemClickListener
·选项改变:setOnItemSelectListener
·长按事件:setOnItemLongClickListener
范例:写一个省市联动的例子
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="province">
<item>甘肃</item>
<item>山西</item>
<item>宁夏</item>
</string-array>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">下拉列表监听</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="selectPro">请选择省份</string>
<string name="selectCity">请选择城市</string>
</resources>
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".SpinnerListenerActivity" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请选择所在省份" />
<Spinner
android:id="@+id/province"
android:prompt="@string/selectPro"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/province"
/>
<Spinner
android:id="@+id/city"
android:prompt="@string/selectCity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
package com.example.spinnerlistenerproject;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
public class SpinnerListenerActivity extends Activity {
Spinner province,city = null;
String s[][] = new String[][]{{"兰州","定西","武威","酒泉"},
{"西安","咸阳","榆林","宝鸡"},{"银川","吴忠","石嘴山","乌海"}};
ArrayAdapter<CharSequence> array = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_spinner_listener);
this.province = (Spinner) super.findViewById(R.id.province);
this.city = (Spinner) super.findViewById(R.id.city);
this.province.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
array = new ArrayAdapter<CharSequence>(SpinnerListenerActivity.this,
android.R.layout.simple_spinner_item,s[arg2]);
array.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
city.setAdapter(array);//给下拉列表设置选项
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// 没有这个需求,就什么都不做,但是,由于这是来自接口的方法,所有我们必须这里覆写一下
}
});
}
}
4.3 小结
(1)下拉列表可以使用OnItemSelectedListener接口进行监听;
(2)使用级联菜单时只需要将子菜单的内容重新设置即可。
5. 监听日期与时间的改变
5.1 知识点
(1)掌握日期及时间的事件处理操作;
(2)可以利用事件动态取得修改后的日期时间。
5.2 具体内容
范例:将日期yyyy-MM-dd HH:mm形式显示日期在文本组件中,只要日期或者时间改变了,那么文本组件中的内容相应改变。
<TableLayout 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: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=".DateAndTimeListenerActivity" >
<TableRow
android:orientation="vertical"
>
<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="此处显示时间日期"
/>
</TableRow>
<TableRow
android:orientation="horizontal"
>
<DatePicker
android:id="@+id/dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TimePicker
android:id="@+id/tp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
</TableLayout>
package com.example.dateandtimelistener;
import android.app.Activity;
import android.os.Bundle;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.EditText;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
public class DateAndTimeListenerActivity extends Activity {
DatePicker dp = null;
TimePicker tp =null;
EditText edt = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_date_and_time_listener);
this.dp = (DatePicker) super.findViewById(R.id.dp);
this.tp = (TimePicker) super.findViewById(R.id.tp);
this.edt = (EditText) super.findViewById(R.id.edt);
this.tp.setIs24HourView(true);
//特别注意下,DatePicker监听的注册和其他的组件有不同
this.dp.init(this.dp.getYear(),this.dp.getMonth(),this.dp.getDayOfMonth(),new OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
initTime();
}
});
this.tp.setOnTimeChangedListener(new OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
initTime();
}
});
}
public void initTime(){//此方法用于修改编辑框中的内容
String input = null;
input = this.dp.getYear()+"-"+(this.dp.getMonth()+1)+"-"+this.dp.getDayOfMonth()+" "+this.tp.getCurrentHour()
+":"+this.tp.getCurrentMinute();
this.edt.setText(input);
}
}
5.3 小结
(1)日期选择器的监听接口为:android.widget.DatePicker.OnDateChangedListener;
(2)时间选择器的监听接口为:android.widget.TimePicker.OnTimeChangedListener;
6. 焦点事件
6.1 知识点
(1)掌握焦点的操作及相关事件处理操作。
6.2 具体内容
范例:说明焦点事件的处理,文本输入框失去焦点的时候显示文本输入框中的内容。
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".OnFocusListenerActivity" >
<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请输入内容"
/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是内容"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是焦点"
/>
</LinearLayout>
package com.example.onfocuslistenerproject;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.widget.EditText;
import android.widget.TextView;
public class OnFocusListenerActivity extends Activity {
EditText edt = null;
TextView tv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_on_focus_listener);
this.edt = (EditText) super.findViewById(R.id.edt);
this.tv = (TextView) super.findViewById(R.id.tv);
edt.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){//得到焦点
edt.setText("");
}else{
tv.setText(edt.getText());
}
}
});
}
}
6.3 小结
(1)焦点事件主要是在组件获得或失去焦点时进行处理操作。