首页 > 技术文章 > Android的Listener用法

vivian187 2020-04-27 20:47 原文

为一个控件添加响应事件,需要为其设置监听器(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

推荐阅读