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
查看评论