Android之“自定义AlertDialog”

在开发中经常会用到AlertDialog,但是Android自带的AlertDialog太丑啦,不如自定义一个AlertDialog

思路:一般的AlertDialog一般包括标题  内容栏  确定按钮和取消按钮;好,在UI总布局中,设置一线性布局,从上到下依次包括TextView TextView LinearLayout,依次显示标题、内容和确定取消按钮(其中LinearLayout中包含两个按钮)。

只需要调整总布局的背景、圆角、以及子布局的VISIBILITY即可

1、没有调整前的Dialog的样子:

         

2、自定义AlertDialog 实现对上述布局的控制,以及业务代码的处理

上述布局代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/alert_bg"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txt_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="15dp"
        android:layout_marginRight="15dp"
        android:gravity="center"
        android:textColor="@color/black"
        android:textSize="18sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/txt_msg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="15dp"
        android:layout_marginRight="15dp"
        android:gravity="center"
        android:textColor="@color/black"
        android:textSize="16sp" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:layout_marginTop="10dp"
        android:background="@color/alertdialog_line" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_neg"
            android:layout_width="wrap_content"
            android:layout_height="43dp"
            android:layout_weight="1"
            android:background="@drawable/alertdialog_left_selector"
            android:gravity="center"
            android:textColor="@color/actionsheet_blue"
            android:textSize="16sp" />

        <ImageView
            android:id="@+id/img_line"
            android:layout_width="0.5dp"
            android:layout_height="43dp"
            android:background="@color/alertdialog_line" />

        <Button
            android:id="@+id/btn_pos"
            android:layout_width="wrap_content"
            android:layout_height="43dp"
            android:layout_weight="1"
            android:background="@drawable/alertdialog_right_selector"
            android:gravity="center"
            android:textColor="@color/actionsheet_blue"
            android:textSize="16sp"
            android:textStyle="bold" />
    </LinearLayout>

</LinearLayout>

3、代码中用到的selector

alertDialog_single_selector.xml

<item android:drawable="@drawable/alert_btn_single_pressed" android:state_pressed="true"/>
 <item android:drawable="@drawable/trans_bg"/>

alertDialog_right_selector.xml

<item android:drawable="@drawable/alert_btn_right_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/trans_bg"/>

4、先写自定义AlertDialog的用法随后附上源码分析吧

private void showDialog(){
    new AlertDialog(MainActivity.this).init()
            .setTitle("通知")
            .setMsg("你现在无法接收到新消息提醒。请到系统中去设置")
            .setCancelable(fasle)
            .setNegativeButton("确定",new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    
                }

    }).show();

效果图如下:

      

5、重点来了,现在要分析AlertDialog的代码,看它如何实现的

public class AlertDialog{
    private LinearLayout container;

    private Display display;
    
    private boolean showTitle=false;//默认这些布局加载时不显示,需要在代码中定义
    private boolean showMsg=false;
    private boolean showPosBtn=false;
    private boolean showNegBtn=false;

    public AlertDialog(Context context){
        this.context=context;
        WindowManager windowManager=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
    display=windowManager.getDefaultDisplay();//display用于获取屏幕的宽和高
   }

    public AlertDialog init(){
        //获取Dialog的布局(背景)
 View   view=LayoutInflater.from(context).inflate(R.layout.view_alertdialog,null);
    
        //获取自定义Dialog布局中的控件(默认都不显示)
        container = (LinearLayout) view.findViewById(R.id.container);
        titleTv = (TextView) view.findViewById(R.id.txt_title);
        titleTv.setVisibility(View.GONE);
        msgTv = (TextView) view.findViewById(R.id.txt_msg);
        msgTv.setVisibility(View.GONE);
        negBtn = (Button) view.findViewById(R.id.btn_neg);
        negBtn.setVisibility(View.GONE);
        posBtn = (Button) view.findViewById(R.id.btn_pos);
        posBtn.setVisibility(View.GONE);
        img_line = (ImageView) view.findViewById(R.id.img_line);
        img_line.setVisibility(View.GONE);

        
        //定义Dialog的布局和参数
        dialog=new Dialog(context,R.style.DialogStyle);
        dialog.setContentView(view);//dialog加载布局


        //调整dialog的背景大小
        container.setLayoutParams(
            new FrameLayout.LayoutParams(
                (int)(display.getWidth()*0.5),
                LinnearLayout.LayoutParams.WRAP_CONTENT));//dialog宽:屏幕的0.85倍 高:包裹内容
        
        return this;
    }

    public AlertDialog setTitle(String title){
        showTitle=true;
        if("".equals(title)){
            titleTv.setText("标题");
        }else{
            titleTv.setText(title);
        }
        return this;
    }

    public AlertDialog setMsg(String msg){
        showMsg=true;
        if("".equals(msg)){
            msgTv.setText("内容");
        }else{
            msgTv.setText(msg);
        }
        return this;
    }

    
    public AlertDialog setCancelable(boolean cancel){
        dialog.setCancelable(cancel);
        return this;
    }

    public AlertDialog setPositiveButton(String txt,final View.OnClickListener listener){
    showPosBtn=true;
    if("".equals(txt)){
        posBtn.setText("确定");
     }else{
        posBtn.setText(txt);
     }

    posBtn.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v){
            listener.onClick(v);
            dialog.dismiss();
         }

});

    return this;
 }


public AlertDialog setNegativeButton(String text, final View.OnClickListener listener) {
        showNegBtn = true;
        if ("".equals(text)) {
            negBtn.setText("取消");
        } else {
            negBtn.setText(text);
        }
        negBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onClick(v);
                dialog.dismiss();
            }
        });
        return this;
    }


    private void setLayout(){
        if(!showTitle && !){
            titleTv.setText("提示");
            titleTv.setVisibility(View.VISIBLE);
        }

        if(showTitle){
            titleTv.setVisibility(View.VISIBLE);
        }

        if(showMsg){
            msgTv.setVisibility(View.VISIBLE);
        }

        if(!showPosBtn && !showNegBtn){
            posBtn.setText("确定");
            posBtn.setVisibility(View.VISIBLE);
               posBtn.setBackgroundResource(R.drawable.alertdialog_single_selector);
            posBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
         }

        if(showPosBtn && showMegBtn){
            posBtn.setVisibility(View.VISIBLE);
            posBtn.setBackGroundResource(R.drawable.alertdialog_right_selector);
            negBtn.setVisibility(View.VISIBLE);
            negBtn.setBackGroundResource(R.drawable.alertDialog_left_selector);
             image_line.setVisibility(View.VISIBLE);//确定与取消按钮之间的竖线 显示
        }
            

     if (showPosBtn && !showNegBtn) {//只显示确定按钮,并且占满全行
            posBtn.setVisibility(View.VISIBLE);
            posBtn.setBackgroundResource(R.drawable.alertdialog_single_selector);
        }

        if (!showPosBtn && showNegBtn) {//只显示取消按钮,并且占满全行
            negBtn.setVisibility(View.VISIBLE);
            negBtn.setBackgroundResource(R.drawable.alertdialog_single_selector);
        }
    }

    public void show(){//dialog的显示
        setLayout();
        dialog.show();
    }





猜你喜欢

转载自blog.csdn.net/weixin_38664232/article/details/84305860