Android中添加监听回调接口的方法
在Android中,我们经常会添加一些监听回调的接口供别的类来回调,比如自定义一个PopupWindow,需要让new这个PopupWindow的Activity来监听PopupWindow中的一些组件点击后的回调,再比如写一个RecyclerView的适配器时,也需要让相应的类来监听它的条目点击事件。
下面我们就以一个PopupWindow来体验一下如何来添加一个监听回调接口
方法一
首先,我们需要定义一个接口,然后再写一个设置监听接口的方法
自定义PopupWindow类
/**
* Created by Tryking on 2016/4/3.
*/
public class MyPopupWindow extends PopupWindow { private static final int DOG = 1;
private static final int PIG = 2;
private final View view;
private final Button dog;
private final Button pig; //这里,我们定义一个接口
public interface OnItemClickListener {
public void onItemClick(Button button, int tag);
} private OnItemClickListener mListener; //写一个设置接口监听的方法
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
} public MyPopupWindow(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.my_popup_window, null);
setContentView(view);
setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
setHeight(ViewGroup.LayoutParams.MATCH_PARENT); dog = (Button) view.findViewById(R.id.dog);
pig = (Button) view.findViewById(R.id.pig); dog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(dog, DOG);
}
}); pig.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(pig, PIG);
}
});
} public MyPopupWindow(Context context) {
this(context, null);
}
}
主Activity类
直接给new出来的PopupWindow设置回调接口
public class MainActivity extends Activity {
private static final int DOG = 1;
private static final int PIG = 2;
private MyPopupWindow mPopupWindow;
private Button button; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_practice_listener);
button = (Button) findViewById(R.id.button); mPopupWindow = new MyPopupWindow(this);
mPopupWindow.setOnItemClickListener(new MyPopupWindow.OnItemClickListener() {
@Override
public void onItemClick(Button button, int tag) {
if (tag == DOG) {
button.setText(button.getText() == "我是小狗" ? "点我是小狗" : "我是小狗");
} else if (tag == PIG) {
button.setText(button.getText() == "我是小猪" ? "点我是小猪" : "我是小猪");
}
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.setFocusable(true);
mPopupWindow.showAsDropDown(v);
}
});
}
}
方法二
我们还可以直接在构造函数里直接让构造的时候就传入一个实现了的接口
自定义PopupWindow类
/**
* Created by Tryking on 2016/4/3.
*/
public class MyPopupWindow extends PopupWindow {
private final View view;
private final Button dog;
private final Button pig; public interface OnItemClickListener {
public void onItemClick(Button button, int tag);
} private OnItemClickListener mListener; public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
} //直接让构造时就传入一个接口
public MyPopupWindow(Context context, AttributeSet attrs,View.OnClickListener listener) {
super(context, attrs);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.my_popup_window, null);
setContentView(view);
setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
setHeight(ViewGroup.LayoutParams.MATCH_PARENT); dog = (Button) view.findViewById(R.id.dog);
pig = (Button) view.findViewById(R.id.pig); dog.setOnClickListener(listener);
pig.setOnClickListener(listener);
}
public MyPopupWindow(Context context,View.OnClickListener listener) {
this(context, null,listener);
}
}
主Activity类
public class PracticeListenerActivity extends Activity {
private MyPopupWindow mPopupWindow;
private Button button; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_practice_listener);
button = (Button) findViewById(R.id.button); //new PopupWindow时就传入一个接口
mPopupWindow = new MyPopupWindow(this, MyListener); button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.setFocusable(true);
mPopupWindow.showAsDropDown(v);
}
});
} // 写一个接口供new的时候传入
private View.OnClickListener MyListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.dog:
((Button) v).setText(((Button) v).getText() == "我是小狗" ? "点我是小狗" : "我是小狗");
break;
case R.id.pig:
((Button) v).setText(((Button) v).getText() == "我是小猪" ? "点我是小猪" : "我是小猪");
}
}
};
}
好了,以上就是两种用来添加监听回调接口的方法,我个人倾向于使用第一种。
Android中添加监听回调接口的方法的更多相关文章
- android中实现监听的四种方法
(1)自身类作为事件监听器 package cn.edu.gdmec.s07150745.work5; import android.support.v7.app.AppCompatActivity; ...
- Android零基础入门第34节:Android中基于监听的事件处理
原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...
- Android中如何监听GPS开启和关闭
转自 chenming 原文 Android中如何监听GPS开启和关闭 摘要: 本文简单总结了如何监听GPS开关的小技巧 有时需要监听GPS的开关(这种需求并不多见).实现的思路是监听代表 GPS ...
- EventTrigger动态添加监听事件
在 Unity3D 中,通过拖拽的方式在 EventTrigger 组件中添加监听事件就不多说了,很简单.这里主要说的是通过代码动态往 EventTrigger 组件中添加监听事件,有个很坑的地方,就 ...
- plsql连接本地oracle数据库,而远程主机却无法连接,出现无监听程序的解决方法(转)
原文转自:plsql连接本地oracle数据库,而远程主机却无法连接,出现无监听程序的解决方法 最近在使用plsql连接本地oracle数据库的时候,在同一网络环境中,出现了可以连接本地oracle, ...
- Android 关于ListView中按钮监听的优化问题(方法一)
在Android应用开发过程中经常会用到ListView,并且每次在item中都要对点击事件进行监听.在给按钮添加OnClickListener时,一般会下意识的在getView()中找到每一个But ...
- Android View转为图片保存为本地文件,异步监听回调操作结果;
把手机上的一个View或ViewGroup转为Bitmap,再把Bitmap保存为.png格式的图片: 由于View转Bitmap.和Bitmap转图片都是耗时操作,(生成一个1M的图片大约500ms ...
- Android 给按钮添加监听事件
在安卓开发中,如果要给一个按钮添加监听事件的话,有以下三种实现方式 1.方式一 public class MainActivity extends ActionBarActivity { @Overr ...
- Android 关于ListView中按钮监听的优化问题(方法二)
关于ListView中按钮监听的优化问题(方法一)地址: http://www.cnblogs.com/steffen/p/3951901.html 之前的方法一,虽然能够解决position的传递, ...
随机推荐
- [BUUCTF]REVERSE——[BJDCTF2020]easy
[BJDCTF2020]easy 附件 例行检查,无壳,32位程序 32位ida载入,main函数和字符串理都没有找到有关flag的提示 根据main函数的提示,有关flag的函数应该被藏起来了,在左 ...
- 扬我国威,来自清华的开源项目火爆Github
前几天TJ君跟大家分享了几个有趣的Github项目(加密解密.食谱.新冠序列,各种有趣的开源项目Github上都有),其中呢,有不少是来自斯坦福大学的项目,当时TJ君就不由得想,什么时候能看到的项目都 ...
- CF935B Fafa and the Gates 题解
Content 一个动点 \(F\) 一开始在平面直角坐标系上原点的位置,随后它会移动 \(n\) 次,每次只能向上走或者向右走 \(1\) 个单位,求经过直线 \(y=x\) 的次数. 数据范围:\ ...
- UVA760 DNA Sequencing 题解
Content 给出两个小写字母组成的字符串,求两个字符串的最长公共子串,如有多个按字典序顺序输出,如没有输出 No common sequence.,每两组数据间输出一个空行,最后一组数据后不应输出 ...
- CF628B New Skateboard 题解
Content 有一个长度为 \(n\) 的数字串 \(s\),求出有多少个子串能够被 \(4\) 整除. 数据范围:\(1\leqslant n\leqslant 3\times 10^5\). S ...
- JAVA 接口返回JSON格式转换类
使用了Lombok插件 Result.java package com.utils; import com.jetsum.business.common.constant.Constant; impo ...
- 人工智能论文解读精选 | PRGC:一种新的联合关系抽取模型
NLP论文解读 原创•作者 | 小欣 论文标题:PRGC: Potential Relation and Global Correspondence Based Joint Relational ...
- LeetCode Top 100 Liked 点赞最高的 100 道算法题
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:刷题顺序,刷题路径,好题,top100,怎么刷题,Leet ...
- [LeetCode] 729. My Calendar I 731. My Calendar II 732. My Calendar III 题解
题目描述 MyCalendar主要实现一个功能就是插入指定起始结束时间的事件,对于重合的次数有要求. MyCalendar I要求任意两个事件不能有重叠的部分,如果插入这个事件会导致重合,则插入失败, ...
- 离线版centos8安装docker笔记
嗨嗨哈哈,已经很久没有坐下来胡编乱造一点笔记了,平时云服务器搞惯了,一个命令就安装好了docker了的,但这次生不逢时的新机房就没那么幸运了,有多不逢时超乎想象,不仅仅服务器没有外网,就连周围方圆一公 ...