Android原生弹框的工具类AlertDialog,Dialog

最近在新项目的开发中,经常使用要使用到Android的AlertDialog弹框,所以做了一个简单的封装。

    /**提示框
     *
     * @param tipText 要提示的文本
     * @param mContext 视图上下文
     */
    public static void showTipDialog(String tipText,Context mContext, DialogInterface.OnClickListener confirm, DialogInterface.OnClickListener cancel){
        if (mContext == null){
            System.out.println("showTipDialog:  mContext is null");
            return ;
        }
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle("提示");
        TextView mMsg = new TextView(mContext);
        mMsg.setText(tipText);
        mMsg.setGravity(Gravity.CENTER_HORIZONTAL);
        mMsg.setTextSize(18);
        builder.setView(mMsg);
        builder.setCancelable(false);
        if (confirm != null){
            builder.setPositiveButton("确定", confirm);
        }
        if (cancel != null){
            builder.setNegativeButton("取消", cancel);
        }
        Dialog tipDialog = builder.create();
        tipDialog.setCanceledOnTouchOutside(false);
        tipDialog.show();
    }

封装一个调用弹框得方法虽然简单,但是在使用中也遇到了一些问题,比较严重的就是在非Activity中使用时传入的上下文对象会导致应用异常退出,原因就是Dialog找不到一个视图页面可以依附,为了解决这个问题下面的工具类也就应运而生。

    /**
     * 通过application获取栈顶的activity实例
     * @param application
     * @return
     */
    public static Activity getTopActivity(Application application) {
        Activity activity = null;
        try {
            Class clz = application.getClass().forName("android.app.ActivityThread");
            Method meth = clz.getMethod("currentActivityThread");
            Object currentActivityThread = meth.invoke(null);
            Field f = clz.getDeclaredField("mActivities");
            f.setAccessible(true);
            ArrayMap obj = (ArrayMap) f.get(currentActivityThread);
            for (Object key : obj.keySet()) {
                Object activityRecord = obj.get(key);
                Field actField = activityRecord.getClass().getDeclaredField("activity");
                actField.setAccessible(true);
                activity = (Activity) actField.get(activityRecord);

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return activity;
    }

这两个方法配合着使用就可以在任何地方弹出提示框。

你可能感兴趣的:(android)