在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中添加监听回调接口的方法的更多相关文章

  1. android中实现监听的四种方法

    (1)自身类作为事件监听器 package cn.edu.gdmec.s07150745.work5; import android.support.v7.app.AppCompatActivity; ...

  2. Android零基础入门第34节:Android中基于监听的事件处理

    原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...

  3. Android中如何监听GPS开启和关闭

    转自 chenming 原文 Android中如何监听GPS开启和关闭   摘要: 本文简单总结了如何监听GPS开关的小技巧 有时需要监听GPS的开关(这种需求并不多见).实现的思路是监听代表 GPS ...

  4. EventTrigger动态添加监听事件

    在 Unity3D 中,通过拖拽的方式在 EventTrigger 组件中添加监听事件就不多说了,很简单.这里主要说的是通过代码动态往 EventTrigger 组件中添加监听事件,有个很坑的地方,就 ...

  5. plsql连接本地oracle数据库,而远程主机却无法连接,出现无监听程序的解决方法(转)

    原文转自:plsql连接本地oracle数据库,而远程主机却无法连接,出现无监听程序的解决方法 最近在使用plsql连接本地oracle数据库的时候,在同一网络环境中,出现了可以连接本地oracle, ...

  6. Android 关于ListView中按钮监听的优化问题(方法一)

    在Android应用开发过程中经常会用到ListView,并且每次在item中都要对点击事件进行监听.在给按钮添加OnClickListener时,一般会下意识的在getView()中找到每一个But ...

  7. Android View转为图片保存为本地文件,异步监听回调操作结果;

    把手机上的一个View或ViewGroup转为Bitmap,再把Bitmap保存为.png格式的图片: 由于View转Bitmap.和Bitmap转图片都是耗时操作,(生成一个1M的图片大约500ms ...

  8. Android 给按钮添加监听事件

    在安卓开发中,如果要给一个按钮添加监听事件的话,有以下三种实现方式 1.方式一 public class MainActivity extends ActionBarActivity { @Overr ...

  9. Android 关于ListView中按钮监听的优化问题(方法二)

    关于ListView中按钮监听的优化问题(方法一)地址: http://www.cnblogs.com/steffen/p/3951901.html 之前的方法一,虽然能够解决position的传递, ...

随机推荐

  1. SWPUCTF_2019_login(格式字符串偏移bss段)

    题目的例行检查我就不放了,将程序放入ida中 很明显的值放入了bss段的格式字符串,所以我们动态调试一下程序 可以看到ebp这个地方0xffd0dd17-->0xffd0dd38-->0x ...

  2. [BUUCTF]REVERSE——xor

    xor 附件 步骤: 附件很小,直接用ida打开,根据检索得到的字符串,找到程序关键函数 程序很简单,一开始让我们输入一个长度为33的字符串给v6,然后v6从第二个字符开始与前一个字符做异或运算,得到 ...

  3. 韩顺平Java(持续更新中)

    原创上课笔记,转载请注明出处 第一章 面向对象编程(中级部分) PDF为主 1.1 IDEA 删除当前行,ctrl+y 复制当前行,ctrl+d 补全代码,alt+/ 添加或者取消注释,ctrl+/ ...

  4. java 输入输出IO流:标准输入/输出System.in;System.out;System.err;【重定向输入System.setIn(FileinputStream);输出System.setOut(printStream);】

    Java的标准输入输出分别通过System.in和System.out来代表的,在默认情况下它分别代表键盘和显示器,当程序通过System.in来获取输入时,实际上是从键盘读取输入 当程序试图通过 S ...

  5. Intellij IDEA中Springboot启动报Command line is too long错误

    启动报错:Error running 'CmsFrontApplication': Command line is too long. Shorten command line for CmsFron ...

  6. MAVEN项目打包报错:Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on pr ...

  7. visual studio c++项目文件分类混乱整理

    演示环境: win10 + vs2015 (下面简称VS)+ visual assist (下面简称VA) 1.混乱 装了VA的VS,有个快捷键,可快速切换 .h 文件和 .cpp(.cc, .cxx ...

  8. 【LeetCode】966. Vowel Spellchecker 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcod ...

  9. 【LeetCode】922. Sort Array By Parity II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用奇偶数组 排序 奇偶数位置变量 日期 题目地址: ...

  10. (原创)WinForm中莫名其妙的小BUG——RichTextBox自动选择字词问题

    一.前言 使用WinForm很久了,多多少少会遇到一些小BUG. 这些小BUG影响并不严重,而且稍微设置一下就能正常使用,而且微软一直也没有修复这些小BUG. 写本系列文章,是为了记录一下这些无伤大雅 ...