飞道的博客

Android学习笔记(Android Studio)5-1 基于监听的事件处理机制(必须深刻理解的Android事件处理)

217人阅读  评论(0)

Android学习笔记5-1


推荐新手向学习视频:B站https://www.bilibili.com/video/av38409964点我传送


当用户在应用界面上执行各种操作时,应用程序需要为用户的动作提供响应,这种响应的过程就是事件处理。

5-1 基于监听的事件处理机制

监听三要素

  • Event Source(事件源)

  • Event(事件)

  • Event Listener(事件监听器)

  • 示例1

      btnTestEvent.setOnClickListener(new View.OnClickListener(){
      	@Override
      	public void onClick(View v){
      		Log.d(TAG,"---OnClick---");
      	}
      });
    

其中btnTestEvent为事件源,new View.OnClickListener()为监听器。

  • 示例2

      btnTestEvent.setOnClickListener(new View.OnTouchListener(){
      	@Override
      	public boolean onTouch(View v,MotionEvent event){
      		switch(event.getAction()){
      			case MontionEvent.ACTION_DOWN:
      				break;
      			case MontionEvent.ACTION_UP:
      				break;
      		}
      		return false;
      	}
      });
    

其中btnTestEvent为事件源,new View.OnTouchListener()为监听器,event为具体事件。

实现监听的方法

  • 1.通过内部类实现

  • 2.通过匿名内部类实现

  • 3.通过事件源所在类实现

  • 4.通过外部类实现

  • 5.布局文件中onClick属性(针对点击事件)

  • 代码示例

  • activity_event.xml文件

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">
          <Button
              android:id="@+id/btn_event"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:text="click me"
              android:textAllCaps="false"
              android:onClick="show"/>
      </LinearLayout>
    
  • 效果

  • MyClickListener.java外部类文件

      package com.ylw.helloworld;
      
      import android.app.Activity;
      import android.view.View;
      
      import com.ylw.helloworld.util.ToastUtil;
      
      //4.通过外部类实现,不常用
      public class MyClickListener implements View.OnClickListener {
      
          private Activity mActivity;
      
          public MyClickListener(Activity activity){
              this.mActivity = activity;
          }
      
          @Override
          public void onClick(View v) {
              ToastUtil.showMsg(mActivity,"外部类click...");
          }
      }
    
  • EventActivity.xml文件

      package com.ylw.helloworld;
      
      import androidx.appcompat.app.AppCompatActivity;
      
      
      import android.os.Bundle;
      import android.view.View;
      import android.widget.Button;
      
      import com.ylw.helloworld.util.ToastUtil;
      
      public class EventActivity extends AppCompatActivity implements View.OnClickListener {
      
          private Button mBtnEvent;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_event);
      
              mBtnEvent = findViewById(R.id.btn_event);
      
              //1.通过内部类实现,在类EventActivity的内部又写了一个类OnClick
              mBtnEvent.setOnClickListener(new OnClick());
              //2.匿名内部类
              mBtnEvent.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      ToastUtil.showMsg(EventActivity.this,"匿名内部类click...");
                  }
              });
              //3.通过事件源所在类实现
              mBtnEvent.setOnClickListener(EventActivity.this);
              //4.通过外部类实现,不常用
              mBtnEvent.setOnClickListener(new MyClickListener(EventActivity.this));
          }
      
          //3.通过事件源所在类实现,实现接口
          @Override
          public void onClick(View v) {
              switch (v.getId()){
                  case R.id.btn_event:
                      ToastUtil.showMsg(EventActivity.this,"事件源所在类click...");
                      break;
              }
          }
      
          //1.通过内部类实现,在类EventActivity的内部又写了一个类OnClick
          class OnClick implements View.OnClickListener{
      
              @Override
              public void onClick(View v) {
                  switch (v.getId()){
                      case R.id.btn_event:
                          ToastUtil.showMsg(EventActivity.this,"内部类click...");
                          break;
                  }
              }
          }
      
          //5.在布局文件里调用该方法,布局文件中onClick属性,这个是最先设置的
          public void show(View v){
              switch (v.getId()){
                  case R.id.btn_event:
                      ToastUtil.showMsg(EventActivity.this,"在布局文件里click...");
                      break;
              }
          }
      }
    

给同一事件源添加多个同种类型监听器会怎么样?

  • 系统只会使用最后一个设置的(布局文件中onClick属性认为是最先设置的)
  • 效果

转载:https://blog.csdn.net/qq_43594119/article/details/104698848
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场