Android的Listener用法
为一个控件添加响应事件,需要为其设置监听器(Listener)。在Android中,View的Listener方法,有多种创建方法。以View的OnClickListener举例:
View的Listener方法一样,都是View类的接口,实现Listener里面的接口,就可以处理相关事件
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
创建Listener的方法如下:
第一种:创建一个类实现OnClickListener的接口
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<com.example.test1.testLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id = "@+id/root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".MainActivity"
android:background="#999900" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id = "@+id/text1"
android:text="第一个text"
android:layout_marginTop="10dp"
android:background="#ff0000" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id = "@+id/button1"
android:text="button"
android:background="#ff00ff" />
</com.example.test1.testLayout>
上面的testLayout是自定义的,也可以使用Android自定义的
MainActivity.java
package com.example.test1;
import android.view.View;
import android.view.View.OnClickListener;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private Button m_btn;
public TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
m_btn = findViewById(R.id.button1);
/* 通过一个实现接口的方式实现监听事件,参数this相当于new OnClickListener()对象, 即class MainActivity对象
用这种方式的话,public void onClick 方法必须写在该MainActivity类中, 且MainActivity类开头实现implements OnClickListener接口, 即this对象可以直接调用接口方法onClick()
*/
m_btn.setOnClickListener(this); // 通过this来访问本生接口下的对象的
tv = findViewById(R.id.text1);
}
@Override
public void onClick(View v) {
String strTmp = "点击Button";
tv.setText(strTmp);
}
}
效果图如下:
button点击后,调用onClick接口改变TextView控件内容
第二种:使用匿名对象创建监听
activity_main.xml同上
MainActivity.java
import android.view.View;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button m_btn;
public TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.text1);
m_btn = findViewById(R.id.button1);
m_btn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
String strTmp = "点击Button";
tv.setText(strTmp);
}
});
}
}
第三种:使用对象创建监听
activity_main.xml同上
MainActivity.java
import android.view.View.OnClickListener;
import android.view.View;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button m_btn;
public TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.text1);
m_btn = findViewById(R.id.button1);
m_btn.setOnClickListener(clickListener);
}
public OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
String strTmp = "点击Button";
tv.setText(strTmp);
}
};
}
第四种:自己设计个监听类,监听的方法引用OnClickListener接口中的方法
activity_main.xml同上
MainActivity.java
import android.view.View;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button m_btn;
public TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.text1);
m_btn = findViewById(R.id.button1);
m_btn.setOnClickListener(new clickListener2());
}
public class clickListener2 implements View.OnClickListener {
@Override
public void onClick(View v) {
String strTmp = "点击Button";
tv.setText(strTmp);
}
};
}
第五种:使用XML文件创建时绑定方法
在布局文件activity_main.xml中为Button控件添加属性:(其他内容同上)
android:onClick="ButtonListener"
MainActivity.java
import android.view.View;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button m_btn;
public TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.text1);
}
public void ButtonListener(View view) {
String strTmp = "点击Button";
tv.setText(strTmp);
}
}
注意:如果信号是自定义的,并且在控件中需要通知画面处理,该怎么做呢?
参考invoke使用
第六种:外部类实现事件监听器接口
参考:
https://blog.csdn.net/i_am_tomato/article/details/42495161
https://blog.csdn.net/ithomer/article/details/7489274