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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM