背景:


最近项目中接触到接口回调,以及Android弹窗PopWindow组件的使用,现在利用学到的知识自己写了一个简单的Demo,练习下在Android下如何运用接口回调,来实现弹窗PopWindow的功能。


代码结构:


1. 定义一个接口:OnSelectItemListener。定义一个方法 void selectItem(String name, int type),作为点击弹窗的每个Item的回调接口。


2. 自定义弹窗类:MyPopupWindow,其布局文件为popup_window.xml。当在MainActivity调用其构造函数创建对象时,同时执行initPopupWindow()函数,给每个Item设置监听器,监听点击Item时,回调接口函数selectItem("Pop Window A", POP_WINDOW_ITEM_1),该函数在MainActivity中实现。


3. 主Activity: MainActivity。其布局文件为一个Button和一个TextView。监听Button,每当点击则弹出PopWindow,呈现三个Item。调用MyPopupWindow类中的方法setOnSelectItemListener(OnSelectItemListener listener),传入OnSelectItemListener 对象作为参数,同时实现回调接口OnSelectItemListener的方法void selectItem(String name, int type)。



主Activity: MainActivity.java

package com.lambdroid.callbacktest2;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;//联系接口的回调以及PopWindow弹窗的简单使用public class MainActivity extends Activity {    private MyPopupWindow myPopupWindow;    private Button btn_pop_window;    private TextView tv_display;    protected Context context;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        context = this;        btn_pop_window = (Button) findViewById(R.id.btn_pop_window);        tv_display = (TextView) findViewById(R.id.tv_display);        //给Button设置事件监听:弹出弹窗        btn_pop_window.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                myPopupWindow.show(btn_pop_window);            }        });        myPopupWindow = new MyPopupWindow(context);        //实现OnSelectItemListener接口的selectItem方法:对于弹窗三个Item的事件监听        myPopupWindow.setOnSelectItemListener(new OnSelectItemListener() {            @Override            public void selectItem(String name, int type) {                //点击电站列表,弹出弹框                if (myPopupWindow != null && myPopupWindow.isShowing()) {                    myPopupWindow.dismiss();                }                tv_display.setText(name);                switch (type){                    case MyPopupWindow.POP_WINDOW_ITEM_1:                        Toast.makeText(context, "我是弹窗A, 我的英文名是" + name, Toast.LENGTH_SHORT).show();                        break;                    case MyPopupWindow.POP_WINDOW_ITEM_2:                        Toast.makeText(context, "我是弹窗B, 我的英文名是" + name, Toast.LENGTH_SHORT).show();                        break;                    case MyPopupWindow.POP_WINDOW_ITEM_3:                        Toast.makeText(context, "我是弹窗C, 我的英文名是" + name, Toast.LENGTH_SHORT).show();                        break;                    default:                        break;                }            }        });    }}



activity_main.xml

<?xml version="1.0" encoding="utf-8"?>    



自定义弹窗类:MyPopupWindow.java

package com.lambdroid.callbacktest2;import android.app.ActionBar;import android.content.Context;import android.graphics.drawable.ColorDrawable;import android.view.LayoutInflater;import android.view.View;import android.widget.LinearLayout;import android.widget.PopupWindow;public class MyPopupWindow implements View.OnClickListener{    private PopupWindow mPopWindow;    private Context mContext;    private LinearLayout llPop1;    private LinearLayout llPop2;    private LinearLayout llPop3;    private int pw_height;    public static final int POP_WINDOW_ITEM_1 = 1;    public static final int POP_WINDOW_ITEM_2 = 2;    public static final int POP_WINDOW_ITEM_3 = 3;    private OnSelectItemListener listener;        public void setOnSelectItemListener(OnSelectItemListener listener){        this.listener = listener;    }    public MyPopupWindow(Context context){        mContext = context;        initPopupWindow();                  //初始化弹窗    }    public void initPopupWindow(){        View view = LayoutInflater.from(mContext).inflate(R.layout.popup_window, null);        mPopWindow = new PopupWindow(view, ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT, true);        mPopWindow.setOutsideTouchable(true);        /** 为其设置背景,使得其内外焦点都可以获得 */        mPopWindow.setBackgroundDrawable(new ColorDrawable());        mPopWindow.setFocusable(true);        pw_height = view.getHeight();        llPop1 = (LinearLayout) view.findViewById(R.id.ll_pop_1);        llPop1.setOnClickListener(this);        llPop2 = (LinearLayout) view.findViewById(R.id.ll_pop_2);        llPop2.setOnClickListener(this);        llPop3 = (LinearLayout) view.findViewById(R.id.ll_pop_3);        llPop3.setOnClickListener(this);    }    //监听三个弹窗的点击事件    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.ll_pop_1:                if(listener != null) {                    listener.selectItem("Pop Window A", POP_WINDOW_ITEM_1);     //回调接口                }                break;            case R.id.ll_pop_2:                if(listener != null) {                    listener.selectItem("Pop Window B", POP_WINDOW_ITEM_2);                }                break;            case R.id.ll_pop_3:                if(listener != null) {                    listener.selectItem("Pop Window C", POP_WINDOW_ITEM_1);                }                break;            default:                break;        }    }    //显示弹窗,并设置弹窗基于标题栏的显示位置    public void show(View view) {        //popupwindow相对view位置x轴偏移量        View viewTemp = mPopWindow.getContentView();        viewTemp.measure(0, 0);        int width = viewTemp.getMeasuredWidth();        int xOffset = (view.getWidth() - width) / 2;        mPopWindow.showAsDropDown(view, xOffset, 0);    }    /**     * 退出popupwindow     */    public void dismiss() {        if (mPopWindow != null && mPopWindow.isShowing()) {            mPopWindow.dismiss();        }    }    /**     * popupwindow是否正在显示     */    public boolean isShowing() {        if(mPopWindow != null) {            return mPopWindow.isShowing();        }        return false;    }}



popup_window.xml

<?xml version="1.0" encoding="utf-8"?>                                                                                            


回调接口:OnSelectItemListener

package com.lambdroid.callbacktest2;public interface OnSelectItemListener {    void selectItem(String name, int type);}




Demo演示



点击Button,弹出弹窗,显示三个Item Android接口回调总结,以及运用到弹窗PopWindow的Demo实现_第1张图片



点击第二个Item,通过回调函数,来实现TextView内容的修改,以及弹出Toast

Android接口回调总结,以及运用到弹窗PopWindow的Demo实现_第2张图片




总结


Java回调情形涉及很多,本文属于接口的异步回调:当不知道何时会执行接口的回调函数,(通过接口回调来对获取到的资源的操作)。除此还有线程间的异步回调(子线程进行耗时操作,操作完毕通知主线程或将数据传给主线程处理),以及利用接口回调来实现线程间的数据通信等等(Android可以利用Handler来实现)。等下次再举例说明Java回调函数的其它情形。


更多相关文章

  1. Android---多线程的处理
  2. Android JNI开发详解(7)-线程操作,异常处理
  3. Android线程与进程(二)线程详解
  4. AsyncTask,IntentService工作原理分析&Android线程池
  5. Android中用AsyncTask简单实现多线程
  6. Android 线程池框架、Executor、ThreadPoolExecutor详解
  7. 【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态

随机推荐

  1. Android多分辨率适配框架(2)— 原理剖析
  2. Android节拍器
  3. Android(安卓)UI布局之RelativeLayout
  4. GridView--学习
  5. Android(安卓)第七课——UI布局
  6. Android编译环境安装
  7. Android之TextView------属性大全
  8. Android(安卓)NDK的入门学习
  9. Android中使用log4j输出log内容到sd卡
  10. Develop--Training(一)Getting Started