6- 自定义Dialog

6- 自定义Dialog


Dialog非常常见,也是必不可少的UI,但是系统自带的UI的确实很多时候不能满足UI上的要求,功能到时很合适,这时候我们就需要自定义Dialog了;
自定义dialog其实是属于自定义继承控件的;

首先自定义一个CustomDialog extends Dialog

public clas View.OnClickListener {
    private static final String TAG = CustomDialog.class.getSimpleName();
    private int layoutId;
    private Context context;
    private int[] clickIds;

//实现构造方法,传入layoutId 布局ID,需要实现点击事件的view的clickIds
    public CustomDialog(Context context, int layoutId,int[] clickIds) {
        super(context, R.style.themeResId);
        this.layoutId = layoutId;
        this.context = context;
        this.clickIds = clickIds;
    }

//重写Dialog的onCreat()方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Window window = getWindow();
        window.setGravity(Gravity.CENTER); // 此处可以设置dialog显示的位置为居中
//        window.setWindowAnimations(R.style.bottom_menu_animation); // 添加动画效果
        setContentView(layoutId);

//设置Dialog屏幕上的尺寸
        WindowManager windowManager = ((Activity) context).getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
        lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
        // 设置dialog宽度为屏幕的4/5
        getWindow().setAttributes(lp);

        setCanceledOnTouchOutside(false);//点击外部消失
        for (int id : clickIds) {
            findViewById(id).setOnClickListener(this);
        }

    }

//对Dialog上面的某个控件设置文字内容,需要在show()之后调用采用效果
    public CustomDialog setViewText(int viewId,String text){
        TextView view = (TextView) findViewById(viewId);
        Log.e(TAG, "setViewText: "+view );
        if(view != null){
            view.setText(text);
        }
        return this;
    }

//获得dialog上的某个view
    public View getView(int viewId){
        View viewById = findViewById(viewId);
        return viewById;
    }

    @Override
    public void onClick(View v) {
        if(listener != null){
            listener.itemClick(v);
        }
    }


    public CustomDialog setListener(DialogItemClickListener listener){
        this.listener = listener;
        return this;
    }
    private DialogItemClickListener listener;
    public interface DialogItemClickListener{
        void itemClick(View view);
    }

    public CustomDialog showDialog(){
        show();
        return this;
    }
}

/****************************使用方法*************************************/
customDialog = new CustomDialog(this, R.layout.item_dialog_update_apk, new int[]{R.id.cancle, R.id.sure});
customDialog.showDialog() //需要先showDialog出来之后才能设置控件,否则为null
        .setViewText(R.id.tv_title, "更新提醒")
        .setViewText(R.id.tv_content, apkBreif)
        .setListener(this);
/***************************dialog的style1**************************************/
<style name="themeResId" parent="Theme.AppCompat.Dialog">
    <item name="android:windowIsFloating">true</item>    <!--是否浮在界面上-->
    <item name="android:windowIsTranslucent">true</item> <!--是否半透明-->
    <item name="android:windowNoTitle">true</item>       <!--是否有标题-->
    <item name="android:windowBackground">@android:color/transparent</item> <!--窗口背景色透明-->
    <item name="android:backgroundDimEnabled">false</item> <!--背景是否模糊显示-->
</style>

/***************************dialog的style2**************************************/
<style name="dialog" parent="@android:style/Theme.Dialog">
    //Dialog的windowFrame框为无
    <item name="android:windowFrame">@null</item>
    //是否浮现在activity之上
    <item name="android:windowIsFloating">true</item>
    //是否半透明
    <item name="android:windowIsTranslucent">true</item>
    //是否显示title
    <item name="android:windowNoTitle">true</item>
    //设置dialog的背景
    <item name="android:background">@android:color/transparent</item>
    //显示区域背景是否透明
    <item name="android:windowBackground">@android:color/transparent</item>
    //就是用来控制灰度的值,当为1时,界面除了我们的dialog内容是高亮显示的,dialog以外的区域是黑色的,完全看不到其他内容,系统的默认值是0.5
    <item name="android:backgroundDimAmount">0.5</item>
    //显示区域以外是否使用黑色半透明背景
    <item name="android:backgroundDimEnabled">true</item>
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值