前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

我的android程序又报错了_Unable to add window

qiguaw 2024-09-04 17:16:18 资源文章 14 ℃ 0 评论

这个错误是由于:


 public void show() {
            loadingDialog.show();
    }



这个之前是上面这样写的.这样写,就会导致,我调用这个dialog,去显示的时候,这个dialog依赖的


activity可能已经销毁了,这个时候,由于异步的原因,调用到这里, 所以肯定会出错的,因为,这个


activity已经没有了,你还想在这个activity上面去显示一个dialog.


public void show() {

        if(getActivityByContext(loadingDialog.getContext())!=null &&
                !getActivityByContext(loadingDialog.getContext()).isFinishing()){
            loadingDialog.show();
        };
    }

    public void setTitle(String msg) {
        tipTextView.setText(msg);
    }

    public static Activity getActivityByContext(Context context) {
        while (context instanceof ContextWrapper) {
            if (context instanceof Activity) {
                return (Activity) context;
            }
            context = ((ContextWrapper) context).getBaseContext();
        }
        return null;
    }



上面这个是修改完的,可以看到这里,通过传入的context,来获取到,这context对应的activity,


获取了以后,然后,判断这个activity,是不是正在关闭,或者已经关闭了,不存在了,已经关闭了就是null,


然后没有关闭的话,就用isFinishing进行判断了一下对吧.如果正在关闭,或者已经关闭了,就不要


再弹框了,如果弹会报错的.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


然后我把:这个WaitDialog的源码贴出来,为了看的方便:


package com.baidu.idl.main.facesdk.utils;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.ContextWrapper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.baidu.idl.main.facesdk.gatelibrary.R;

public class WaitDialog {
    Dialog loadingDialog = null;
    String msg = "";
    Context context = null;
    TextView tipTextView;

    private WaitDialog(Context context, String msg) {
        this.context = context;
        this.msg = msg;
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.dialog_loading, null);// 得到加载view
        LinearLayout layout = (LinearLayout) v
                .findViewById(R.id.dialog_loading_view);// 加载布局
        tipTextView = (TextView) v.findViewById(R.id.tipTextView);// 提示文字
        tipTextView.setText(msg);// 设置加载信息
        loadingDialog = new Dialog(context, R.style.MyDialogStyle);// 创建自定义样式dialog
        loadingDialog.setCancelable(true); // 是否可以按“返回键”消失
        loadingDialog.setCanceledOnTouchOutside(false); // 点击加载框以外的区域
        loadingDialog.setContentView(layout, new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));// 设置布局
        loadingDialog.getLayoutInflater();

        /**
         * 将显示Dialog的方法封装在这里面
         */

        Window window = loadingDialog.getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        window.setGravity(Gravity.CENTER);
        window.setAttributes(lp);
        window.setWindowAnimations(R.style.PopWindowAnimStyle);
    }

    public static WaitDialog getInstance(Context context, String msg) {
        return new WaitDialog(context, msg);
    }

    public void show() {

//        if (!loadingDialog.getContext()())//xActivity即为本界面的Activity
//        {
////dialog.show
//        }
        if(getActivityByContext(loadingDialog.getContext())!=null &&
                !getActivityByContext(loadingDialog.getContext()).isFinishing()){
            loadingDialog.show();
        };
    }

    public void setTitle(String msg) {
        tipTextView.setText(msg);
    }

    public static Activity getActivityByContext(Context context) {
        while (context instanceof ContextWrapper) {
            if (context instanceof Activity) {
                return (Activity) context;
            }
            context = ((ContextWrapper) context).getBaseContext();
        }
        return null;
    }

    /**
     * 关闭dialog
     */
    public void closeDialog() {
        try {
            if (loadingDialog != null && loadingDialog.isShowing()) {
                loadingDialog.dismiss();
            }
        } catch (Exception e) {

        } finally {
            loadingDialog = null;
        }
    }

}



然后下面,封装一下WaitDialog :


    private WaitDialog waitDialog;

    public void showDialog(Context context, String msg) {
        if (waitDialog != null) {
            waitDialog.closeDialog();
        }
        waitDialog = WaitDialog.getInstance(context, msg);
        waitDialog.show();
        dialogState = 2; //开着是2
    }

    public void closeDialog() {
        if (waitDialog != null) {
            waitDialog.closeDialog();
            dialogState = 1; //关闭是1
        }
    }



然后使用的时候:


BaseApplication.context().showDialog(FaceBodyCheckActivity.this, "正在连接设备...");



可以看到这里,我把上面的showDialog方法,写到了BASEApplication中了,使用的时候,就按照


上面这样使用就可以了:


BaseApplication.context().closeDialog();



然后:


BaseApplication 这类的代码我也贴出来吧.方便看:


package com.baidu.idl.main.facesdk.activity;


import android.annotation.TargetApi;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;

import com.baidu.idl.main.facesdk.utils.DeviceFinal;
import com.baidu.idl.main.facesdk.utils.WaitDialog;
import com.qn.device.listener.QNResultCallback;
import com.qn.device.out.QNBleApi;


public class BaseApplication extends Application {

    static Context _context;

    private static String PREF_NAME = "ydy_store";

    private String token;
    public  Integer dialogState = 0;
    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    /**
     * Context base application.
     *
     * @return the base application
     */
    public static synchronized BaseApplication context() {
        return (BaseApplication) _context;
    }

    /**
     * Gets preferences.
     *
     * @return the preferences
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static SharedPreferences getPreferences() {
        return context().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    }

    /**
     * On create.
     */
    @Override
    public void onCreate() {
        super.onCreate();
        QNBleApi mQNBleApi = QNBleApi.getInstance(this);
        String encryptPath = "file:///android_asset/123456789.qn";
        mQNBleApi.initSdk(DeviceFinal.QN_APPID, encryptPath, new QNResultCallback() {
            @Override
            public void onResult(int code, String msg) {
                System.out.println("初始化" + code + ":" + msg);
            }
        });
        _context = getApplicationContext();
//        ToastApp.initToastUtils(_context);
        CrashHandler crashHandler = CrashHandler.getInstance();
        crashHandler.init(_context);
        //初始化Context
//        ContextHelper.getInstance().init(this);


    }

    private WaitDialog waitDialog;

    public void showDialog(Context context, String msg) {
        if (waitDialog != null) {
            waitDialog.closeDialog();
        }
        waitDialog = WaitDialog.getInstance(context, msg);
        waitDialog.show();
        dialogState = 2; //开着是2
    }

    public void closeDialog() {
        if (waitDialog != null) {
            waitDialog.closeDialog();
            dialogState = 1; //关闭是1
        }
    }
}








?

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表