Activity 通用Dialog 以及避免IllegalArgumentException

目录

IllegalArgumentException

1. 使用Activity自带的Dialog控制方法

2. 限制Dialog的生命周期

通用NewDialog.java

NewDialogUtils.java

R.style.Custom_Progress(styles.xml)

progress_layout.xml

shape_dialog_white.xml

  progressbar.xml

使用

Dialog位置发生偏移


IllegalArgumentException

造成原因:依附的Activity不存在了,然后对Dialog进行处理导致的。

1. 使用Activity自带的Dialog控制方法

       在Activity中需要使用对话框,可以使用Activity自带的回调,比如onCreateDialog(),showDialog(),dimissDialog(),removeDialog()等等。毕竟这些都是Activity自带的方法,所以用起来更方便,也不用显示创建和操控Dialog对象,一切都由框架操控,相对来说比较安全。

2. 限制Dialog的生命周期

       让创建的Dialog对象的存活周期跟Activity的生命周期一致,也就是说Dialog的生命周期被限定在Activity的onCreate()和onDestroy()方法之间。

通用NewDialog.java

package com.youpinwallet.ypw.view;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.WindowManager;
import com.youpinwallet.ypw.R;

/*
 * 白色背景,垂直居中
 * @author Administrator
 *
 */
public class NewDialog extends Dialog {
    Activity mParentActivity;
    public NewDialog(Context context, int theme) {
        super(context, theme);
        mParentActivity= (Activity) context;
    }

    public NewDialog(Context context) {
        super(context);
    }

    /**
     * 弹出自定义ProgressDialog
     *
     * @param context        上下文
     * @param cancelable     是否按返回键取消
     * @param cancelListener 按下返回键监听
     * @return
     */
    public static NewDialog create(Context context, boolean cancelable, OnCancelListener cancelListener) {
        NewDialog dialog = new NewDialog(context, R.style.Custom_Progress);
        dialog.setContentView(R.layout.progress_layout);
        // 按返回键是否取消
        dialog.setCancelable(cancelable);
        // 监听返回键处理
        dialog.setOnCancelListener(cancelListener);
        // 设置居中
        dialog.getWindow().getAttributes().gravity = Gravity.CENTER;
        WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
        // 设置背景层透明度
        lp.dimAmount = 0.2f;
        dialog.getWindow().setAttributes(lp);
//    dialog.show();
        return dialog;
    }
    @Override
    public void dismiss()
    {
        // 避免依附界面销毁跑出的异常java.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow$DecorView
        if (mParentActivity != null && !mParentActivity.isFinishing())
        {
            super.dismiss();    //调用超类对应方法
        }
    }
}

NewDialogUtils.java

package com.qunarjie.qnj.utils;

import android.content.Context;

import com.qunarjie.qnj.view.NewDialog;

//请稍等通用
public class NewDialogUtils {
    private static NewDialog dialog = null;

    public static void setNewDialog(Context context) {
        if (context != null) {
            if (dialog != null) {
                dialog.dismiss();
                dialog = null;
            }
            if (dialog == null) {
                dialog = NewDialog.create(context, true, null);
            }
            dialog.show();
        }

    }

    public static void dismissNewDialog() {
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
            dialog = null;
        }
    }
}

R.style.Custom_Progress(styles.xml)

<!-- 自定义Progress -->
<style name="Custom_Progress" parent="@android:style/Theme.Dialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowCloseOnTouchOutside">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

progress_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:background="@drawable/shape_dialog_white"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="20dp"
    android:paddingLeft="30dp"
    android:paddingRight="30dp"
    android:paddingTop="20dp">

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminateDrawable="@drawable/progressbar" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/mdp_15"
        android:text="请稍等..."
        android:textColor="@color/color_text_dark"
        android:textSize="@dimen/msp_14" />

</LinearLayout>

shape_dialog_white.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <corners android:radius="5dp" />

    <solid android:color="@color/white" />

</shape>

  progressbar.xml

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="3600">

    <shape
        android:innerRadiusRatio="3"
        android:shape="ring"
        android:thicknessRatio="8"
        android:useLevel="false">
        <gradient
            android:centerY="0.50"
            android:endColor="#12b7f5"
            android:startColor="#038fef"
            android:type="sweep"
            android:useLevel="false" />
    </shape>

</animated-rotate>

使用


<activity
    android:name=".activity.Activity"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:theme="@style/dialog_style" />

Dialog位置发生偏移

错误写法
<style name="dialog_style" parent="Theme.AppCompat.Dialog">
    <item name="android:windowIsFloating">true</item>  <!--是否悬浮在activity上-->
    <item name="android:windowNoTitle">true</item> <!--透明是否-->
    <item name="windowActionBar">false</item>
    <item name="android:windowFrame">@null</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:adjustViewBounds">true</item>
    <item name="android:backgroundDimAmount">0.4</item><!--透明度 0.0f到1.0f之间。1.0完全不透明,0.0f完全透明-->
    <item name="android:windowCloseOnTouchOutside">false</item><!--禁用点击空白处自动关闭-->
</style>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅次

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值