為一個控件添加響應事件,需要為其設置監聽器(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