Android简单实用的自定义Dialog

自己封装了一个简单的Dialog,基本上所有功能也都能实现了。传上来供大家参考学习,有更好的点子,希望大家提出。
我们系统自带的AlertDialog的样式非常的难看。有时候我们要实现其他样式的时候,需要set一个view然后再做操作。但是改背景,和圆角等都不方便。
我是通过继承AlertDialog中的内部类Builder实现的。封装以后,使用非常方便。有5个public方法供使用即可达到要求:
1、setView();传入自定义的view;
2、setWidthRadio();设置宽度的比例(值0-1),默认是0.8屏幕的宽;
3、showDialog();显示出来;
4、getViewById();获取里面的控件,做点击事件等;
5、dismiss();dialog的消失;
先看图片:

这里写图片描述

实现上述样式需要以下几步:

一、自定义一个dialog的样式。主要作用是去掉背景色,去掉边框等,直接复制到Styles文件中就可以了。

<style name="dialog" parent="@android:style/Theme.Dialog">
    <!--设置背景透明-->
    <item name="android:windowBackground">@android:color/transparent</item>
    <!--设置去边框--> 
    <item name="android:windowFrame">@null</item>
    <!--设置是否浮动于activity之上-->
    <item name="android:windowIsFloating">true</item>
    <!--设置背景activity是否模糊,默认是true-->
    <item name="android:backgroundDimEnabled">true</item>
    <!--设置模糊的程度0为不模糊,1为全黑-->
    <item name="android:backgroundDimAmount">0.5</item> 
</style>

二、继承AlertDialog.Builder.废话不多说,上代码:

package com.yhq.customdialog;

import android.content.Context;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class CustomDialog extends AlertDialog.Builder {
    private Context mContext;
    private int mDialogWidth;
    private View mView;
    private AlertDialog mDialog;

    public CustomDialog(Context context, int themeResId) {
        super(context, themeResId);
        init(context);
    }

    private void init(Context context) {
        mContext = context;
        mDialogWidth = (int) (0.8 * getScreenWidth());//默认0.8屏幕宽

    }

    /**
     * 设置自定义的view
     *
     * @param layoutResId
     * @return
     */
    public CustomDialog setView(int layoutResId) {
        mView = LayoutInflater.from(mContext).inflate(layoutResId, null);
        return (CustomDialog) super.setView(mView);
    }

    /**
     * 设置dialog的宽度
     *
     * @param radio 指的是屏幕宽度的几倍,取值范围一般为0-1之间
     */
    public CustomDialog setWidthRadio(float radio) {
        mDialogWidth = (int) (radio * getScreenWidth());
        return this;
    }

    /**
     * show对话框
     */
    public void showDialog() {
        mDialog = create();
        mDialog.show();
        Window window = mDialog.getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.width = mDialogWidth;
        window.setAttributes(params);
    }

    public View getViewById(int id) {
        View view = mView.findViewById(id);
        return view;
    }

    public void dismiss() {
        mDialog.dismiss();
    }


    //获取屏幕宽度
    private int getScreenWidth() {
        WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        return wm.getDefaultDisplay().getWidth();
    }
}

三、MainActivity中代码

package com.yhq.customdialog;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void click(View view) {
        final CustomDialog dialog = new CustomDialog(this, R.style.dialog);//这边自定义样式必须要有
        dialog.setView(R.layout.dialog_view);//设置自定义的view
        dialog.setWidthRadio(0.6f);//设置宽度的比例,与屏幕宽度比,默认0.8
        dialog.showDialog();//显示dialog
        TextView tv2 = (TextView) dialog.getViewById(R.id.tv2);//根据资源id获取里面控件
        TextView tv3 = (TextView) dialog.getViewById(R.id.tv3);//根据资源id获取里面控件
        tv2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //dosomething
                dialog.dismiss();//控制dialog消失
            }
        });
        tv3.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //dosomething
                dialog.dismiss();//控制dialog消失
            }
        });

    }

}

到此为止整个自定义的Dialog就完成了。是不很简单?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值