高仿App--元贝驾考(二)Dialog工具类

本文介绍了一种自定义Dialog的方法,包括创建基类BaseDialog及工具类DialogUtils,用于灵活设置Dialog样式、大小和位置,并提供了具体使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class BaseDialog extends Dialog{

    private Context context;

    private Window dialogWindow;

    private WindowManager.LayoutParams dialogLayoutParams;

    public BaseDialog(@NonNull Context context){
        super(context);
        this.context = context;
        init();
    }

    public BaseDialog(@NonNull Context context, @StyleRes int themeResId) {
        super(context, themeResId);
        this.context = context;
        init();
    }


    private void init(){
        dialogWindow = this.getWindow();
        dialogLayoutParams = dialogWindow.getAttributes();
        setCanceledOnTouchOutside(true);//设置点击Dialog外部任意区域关闭Dialog
    }

    public void setGravity(int gravity){
        dialogWindow.setGravity(gravity);
    }

    public Window getDialogWindow(){
        return dialogWindow;
    }

    public WindowManager.LayoutParams getDialogLayoutParams(){
        return dialogLayoutParams;
    }

}

/**
 * dialog工具类
 */

public class DialogUtils {

    private Context context;
    private BaseDialog baseDialog;

    private WindowManager.LayoutParams layoutParams;

    public DialogUtils(Context context){
        this.context = context;
        baseDialog = new BaseDialog(context, R.style.NoTitleDialog);
        layoutParams = baseDialog.getDialogLayoutParams();
    }

    public DialogUtils setContentView(View view){
        baseDialog.setContentView(view);
        layoutParams = baseDialog.getDialogLayoutParams();
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        baseDialog.getDialogWindow().setAttributes(layoutParams);
        return this;
    }

    public DialogUtils setContentViewSize(double width, double height){
        if(width != 0){
            layoutParams.width = (int) width;
        }
        if(height != 0){
            layoutParams.height = (int) height;
        }
        baseDialog.getDialogWindow().setAttributes(layoutParams);
        return this;
    }

/**
*  为Dialog设置显示位置的时候为什么要先设置其显示位置为左上角呢?
*  因为diaolog的默认显示位置为屏幕的正中央(center),而我们并不知道其当前的XY,所以XY点还是
*  从屏幕的左上角开始计算比较好
*/
    public DialogUtils setXY(int x, int y){
        layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
        layoutParams.x = x;
        layoutParams.y = y;
        baseDialog.getDialogWindow().setAttributes(layoutParams);
        return this;
    }

    public DialogUtils setGravity(int gravity){
        baseDialog.setGravity(gravity);
        return this;
    }

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

    public BaseDialog getBaseDialog(){
        return baseDialog;
    }
}



调用实例

    private View tipExitView;
    private TextView tipExitCancelTv;
    private TextView tipExitOkTv;
    private DialogUtils dialogUtils;

    @Override
    public void onBackPressed() {
//        super.onBackPressed();
        tipExitView = View.inflate(this,R.layout.view_back_tip,null);
        tipExitCancelTv = (TextView) tipExitView.findViewById(R.id.dialog_exitTip_cancel);
        tipExitOkTv = (TextView) tipExitView.findViewById(R.id.dialog_exitTip_ok);
        tipExitCancelTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialogUtils.getBaseDialog().cancel();
            }
        });
        tipExitOkTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                System.exit(0);
            }
        });
        dialogUtils = new DialogUtils(this);
        dialogUtils.show();
        dialogUtils.setContentView(tipExitView);
        dialogUtils.setContentViewSize(BaseApplication.WINDOW_WIDTH * 0.8,0);
    }



下面是两种常用Style,一种是透明,一种半透明

<!--无标题透明dialog-->
<style name="NoTitleTransparentDialog">
    <item name="android:windowTitleStyle">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

<!--无标题不透明-->
<style name="NoTitleDialog">
    <item name="android:windowTitleStyle">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsFloating">true</item>
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值