在学习安卓开发的过程中,按钮是最常用的UI组件,可以通过点击按钮实现不同的动作,要想实现按钮的点击功能,需要对按钮设置监听器,其中一些概念需要重点理解,在此给出详细介绍:
一、UI事件的理解
- 事件:当我们点击UI界面时,系统会自动创建相应的事件对象,事件是系统自动创建的;
- 事件源:产生事件的组件,例如当我们按下按钮时,按钮就是事件源;
- 监听器:系统通过监听器实现对事件的拦截处理。
二、按钮点击事件的实现步骤
通过上面的理解可以知道,当我们按下按钮时,系统会自动创建一个点击事件,并调用按钮设置好的监听器中的onclick()方法。因此我们要实现点击按钮时产生相应动作,需要对其设置监听器。实现按钮点击动作的步骤如下:
- 在xml文件中给出bButton控件;
- 在Activity中通过findViewById进行实例化;
- 通过按钮对象的setOnClickListener(OnClickListener l)方法设置监听器
- 在监听器对象中的onClick方法中设置点击动作。
其中步骤三种setOnClickListener(OnClickListener l)方法需要传入一个OnClickListener对象,然而OnClickListener是View中的一个接口,以下是其源码。要想得到其对象,有两种方式:
(1)通过匿名内部类对象实现;
(2)将该Activity类实现OnClickListener接口,将this作为其对象;
相应的可以得到三种点击事件的写法。(匿名内部类对象可以直接在调用setOnClickListener方法时进行new,也可以将其作为成员变量,在传入setOnClickListener方法)
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
三、按钮点击事件的写法
- 通过setOnClickListener(new View.OnClickListener )实现,一般用于只有一个按钮需要设置点击事件的情况,实现代码如下:
public class MainActivity extends Activity {
private Button btn_setonclicklistener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //加载界面
btn_setonclicklistener = (Button) findViewById(R.id.btn_setonclicklistener);//实例化按钮对象
//通过匿名内部类设置监听器
btn_setonclicklistener.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
}
- 通过匿名内部类对象作为成员变量实现,该方法其实就是将匿名内部类进行了抽取,在多次设置监听器时减少了代码量,相应的实现代码如下:
public class ThirdActivity extends AppCompatActivity {
private Button btn_setonclicklistener1;
private Button btn_setonclicklistener2;
private Intent intent;
//创建OnClickListener接口的匿名内部类对象
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_setonclicklistener1:
Toast.makeText(ThirdActivity.this,"第一个按钮被点击",Toast.LENGTH_SHORT).show();
startActivity(intent);
break;
case R.id.btn_setonclicklistener2:
Toast.makeText(ThirdActivity.this,"第二个按钮被点击",Toast.LENGTH_SHORT).show();
startActivity(intent);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
btn_setonclicklistener1 = (Button) findViewById(R.id.btn_setonclicklistener1);
btn_setonclicklistener2 = (Button) findViewById(R.id.btn_setonclicklistener2);
btn_setonclicklistener1.setOnClickListener(listener);
btn_setonclicklistener2.setOnClickListener(listener);
intent = new Intent(this, FourthActivity.class);
}
}```
3. 通过this实现,这种方法需要本身的Activity实现OnClickListener接口,一般用于多个按钮需要设置监听器,相应的实现代码如下:
```java
public class SecondActivity extends AppCompatActivity implements View.OnClickListener{
private Button btn_setonclicklistener1;
private Button btn_setonclicklistener2;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
btn_setonclicklistener1 = (Button) findViewById(R.id.btn_setonclicklistener1);
btn_setonclicklistener2 = (Button) findViewById(R.id.btn_setonclicklistener2);
btn_setonclicklistener1.setOnClickListener(this);
btn_setonclicklistener2.setOnClickListener(this);
intent = new Intent(this, ThirdActivity.class);
}
@Override
public void onClick(View v) { //v就是发生事件的视图对象(被点击的按钮)
switch (v.getId()){
case R.id.btn_setonclicklistener1:
//这里的this就是SecondActivity的对象本身,因此不需要使用SecondActivity.this
Toast.makeText(this,"第一个按钮被点击",Toast.LENGTH_SHORT).show();
startActivity(intent);
break;
case R.id.btn_setonclicklistener2:
Toast.makeText(this,"第二个按钮被点击",Toast.LENGTH_SHORT).show();
startActivity(intent);
break;
}
}
}
- 通过Button接口的onClick属性实现,该方法只需要在xml文件添加Button接onClick属性,并在Activity中给下相应的方法即可,是最简单的实现,相应的实现代码如下:
<?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:orientation="vertical"
android:gravity="center_horizontal"
android:layout_height="match_parent"
tools:context="com.example.hp.setonclicklistener.SecondActivity">
<Button
android:id="@+id/btn_setonclicklistener2"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textSize="20sp"
android:padding="10dp"
android:layout_marginTop="40sp"
android:text="通过按钮属性设置点击事件"
android:onClick="startMainActivity"
/>
</LinearLayout>
public class FourthActivity extends AppCompatActivity {
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fourth);
intent = new Intent(this, MainActivity.class);
}
//直接给出Onclick属性对应的方法即可
public void startMainActivity(View v){
startActivity(intent);
}
}