在自定义Toast的时候,可能会用到点击事件,但是android系统本身Toast只是用于提示,并不支持点击事件,即使自定义Toast也不支持点击事件,查看Toast源码可以发现,其内部的TN.class(该为私有类,外部调用不了)里面的WindowManager.LayoutParams 的flags属性有WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,如图:

所以,要想Toast开启点击事件,需要通过反射的方法来改变其内部的WindowManager.LayoutParams的flags,去掉WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE这个属性,

实现如下:

public class ClickToast{    private static Toast mToast;    private static Button btn;    public static void showToast (final Context context, int duration){        if(mToast == null){            LayoutInflater inflater = (LayoutInflater)context.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);            //自定义布局            View view = inflater.inflate(R.layout.toast_mytoast, null);            btn= view.findViewById(R.id.btn);            btn.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    //这里可以做点击操作                }            });            mToast = Toast.makeText(context.getApplicationContext(), "", duration);            //这里可以指定显示位置    //            mToast.setGravity(Gravity.BOTTOM, 0, 0);            mToast.setView(view);        }        try {            Object mTN ;            mTN = getField(mToast, "mTN");            if (mTN != null) {                Object mParams = getField(mTN, "mParams");                if (mParams != null                        && mParams instanceof WindowManager.LayoutParams) {                    WindowManager.LayoutParams params = (WindowManager.LayoutParams) mParams;                    //显示与隐藏动画                    params.windowAnimations = R.style.ClickToast;                    //Toast可点击                    params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON                            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;                    //设置viewgroup宽高                    params.width = WindowManager.LayoutParams.MATCH_PARENT; //设置Toast宽度为屏幕宽度                    params.height = WindowManager.LayoutParams.WRAP_CONTENT; //设置高度                }            }        } catch (Exception e) {            e.printStackTrace();        }        mToast.show();    }    /**     * 反射字段     * @param object 要反射的对象     * @param fieldName 要反射的字段名称     */    private static Object getField(Object object, String fieldName)            throws NoSuchFieldException, IllegalAccessException {        Field field = object.getClass().getDeclaredField(fieldName);        if (field != null) {            field.setAccessible(true);            return field.get(object);        }        return null;    }}

使用:

ClickToast.showToast(MainActivity.this, Toast.LENGTH_LONG);

动画:

style.xml

anim_clicktoast_in.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:fromYDelta="100"        android:toYDelta="0"        android:duration="200"        />set>

anim_clicktoast_out.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:fromYDelta="0"        android:toYDelta="100"        android:duration="200"        />set>

更多相关文章

  1. 这些年我踩过的坑——Android
  2. 关于android的开发环境
  3. RXJava
  4. 黑马程序员12——android之事件传播机制
  5. android appwidget 笔记
  6. android 使用butterknife简化加载布局控件
  7. Android滑动事件冲突解决 Touch事件处理机制
  8. Android(安卓)Studio 基础入门笔记
  9. 使用Jenkins进行Android自动打包及SonarQube代码自动检测

随机推荐

  1. Android(安卓)为不同的语言和硬件创建资
  2. Android之微信第三方登录
  3. Android(安卓)依赖中的jar 包获取方式
  4. Android(安卓)面部识别之一(SDK自带检测检
  5. Android碎片机制
  6. Android(安卓)任务、进程和线程
  7. 招聘安卓手游软件开发工程师/Android手游
  8. 【iOS】OC与JS交互 网页中调用JS与JS注入
  9. 【Rayeager PX2分享】修改安卓开机后进入
  10. android的单例设计模式