Android之简单的实现一个自定义Dialog

效果图:

Android之简单的实现一个自定义Dialog_第1张图片


前言:

最近在项目中遇到一个问题,就是启动页弹窗提示一个隐私政策的操作。我一开始用的是Dialog,但是为了符合公司的"审美"(装B),所以为了使弹窗不那么单调,我换成了PopupWindow,上线一段时间后,随着用户的增加,出现了问题,让我很是头痛。原因是,在Android6.0之后的版本,弹窗都是正常居中显示,但是Android6.0之前(包含6.0)弹窗消失了。同时我给设置了弹窗出现时,点击外部不能取消,所以导致6.0的用户在使用时,卡在了欢迎界面。网上找了很多博客,也没有解决我的问题,所以,又换回了DIalog。不同的是 为了美观,实现一个自定义Dialog。

一、创建自定义Dialog

1.创建一个类:CommonDialog并继承Dialog。

下面附上我的代码:

public class CommonDialog extends Dialog {

/**

    * 显示的图片

    */

    private ImageViewimageIv ;

    /**

    * 显示的标题

    */

    private TextViewtitleTv ;

    /**

    * 显示的消息

    */

    private TextViewmessageTv ;

    /**

    * 确认和取消按钮

    */

    private ButtonnegtiveBn ,positiveBn;

    /**

    * 按钮之间的分割线

    */

    private ViewcolumnLineView ;

    private TextViewprivacy;

    public CommonDialog(Context context) {

super(context, R.style.CustomDialog);

    }

/**

    * 都是内容数据

    */

    private Stringmessage;

    private Stringtitle;

    private Stringpositive,negtive ;

    private int imageResId = -1 ;

    /**

    * 底部是否只有一个按钮

    */

    private boolean isSingle =false;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.base_layout_dialog);

        //按空白处不能取消动画

        setCanceledOnTouchOutside(false);

        //初始化界面控件

        initView();

        //初始化界面数据

        refreshView();

        //初始化界面控件的事件

        initEvent();

    }

/**

    * 初始化界面的确定和取消监听器

    */

    private void initEvent() {

        //设置确定按钮被点击后,向外界提供监听

        positiveBn.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                    if (onClickBottomListener!=null) {

                        onClickBottomListener.onPositiveClick();

                    }

            }

    });

        //设置取消按钮被点击后,向外界提供监听

        negtiveBn.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                    if (onClickBottomListener!=null) {

                            onClickBottomListener.onNegtiveClick();

                    }

            }

    });

        //设置隐私政策被点击后,向外界提供监听

        privacy.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                if(onClickBottomListener!=null){

                        onClickBottomListener.onPrivacyClick();

                    }

            }

    });

}

/**

    * 初始化界面控件的显示数据

    */

    private void refreshView() {

//如果用户自定了title和message

        if (!TextUtils.isEmpty(title)) {

                titleTv.setText(title);

                titleTv.setVisibility(View.VISIBLE);

        }else {

                titleTv.setVisibility(View.GONE);

        }

        if (!TextUtils.isEmpty(message)) {

                messageTv.setText(message);

        }

        //如果设置按钮的文字

        if (!TextUtils.isEmpty(positive)) {

                positiveBn.setText(positive);

        }else {

                positiveBn.setText("确定");

        }

        if (!TextUtils.isEmpty(negtive)) {

                negtiveBn.setText(negtive);

        }else {

                negtiveBn.setText("取消");

        }

        if (imageResId!=-1){

i                mageIv.setImageResource(imageResId);

                imageIv.setVisibility(View.VISIBLE);

        }else {

                imageIv.setVisibility(View.GONE);

        }

/**

        * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件

        */

        if (isSingle){

            columnLineView.setVisibility(View.GONE);

            negtiveBn.setVisibility(View.GONE);

        }else {

            negtiveBn.setVisibility(View.VISIBLE);

            columnLineView.setVisibility(View.VISIBLE);

        }

}

    @Override

    public void show() {

            super.show();

            refreshView();

        }

/**

    * 初始化界面控件

    */

    private void initView() {

        negtiveBn = (Button) findViewById(R.id.negtive);

        positiveBn = (Button) findViewById(R.id.positive);

        titleTv = (TextView) findViewById(R.id.title);

        messageTv = (TextView) findViewById(R.id.message);

        imageIv = (ImageView) findViewById(R.id.image);

        columnLineView = findViewById(R.id.column_line);

        privacy = findViewById(R.id.privacy);

    }

/**

    * 设置确定取消按钮的回调

    */

    public OnClickBottomListeneronClickBottomListener;

    public CommonDialogsetOnClickBottomListener(OnClickBottomListener onClickBottomListener) {

            this.onClickBottomListener = onClickBottomListener;

            return this;

    }

public interface OnClickBottomListener{

/**

        * 点击确定按钮事件

        */

        public void onPositiveClick();

        /**

        * 点击取消按钮事件

        */

        public void onNegtiveClick();

        /**

        * 点击隐私政策事件

        */

        public void onPrivacyClick();

    }

public StringgetMessage() {

return message;

    }

public CommonDialogsetMessage(String message) {

this.message = message;

return this ;

    }

public StringgetTitle() {

return title;

    }

public CommonDialogsetTitle(String title) {

this.title = title;

return this ;

    }

public StringgetPositive() {

return positive;

    }

public CommonDialogsetPositive(String positive) {

this.positive = positive;

return this ;

    }

public StringgetNegtive() {

return negtive;

    }

public CommonDialogsetNegtive(String negtive) {

this.negtive = negtive;

return this ;

    }

public int getImageResId() {

return imageResId;

    }

public boolean isSingle() {

return isSingle;

    }

public CommonDialogsetSingle(boolean single) {

isSingle = single;

return this ;

    }

public CommonDialogsetImageResId(int imageResId) {

this.imageResId = imageResId;

return this ;

    }

}


上面的代码自己看看 然后你就可以直接复制拿去用了。

然后补充一个style文件 和xml文件

style:

Android之简单的实现一个自定义Dialog_第2张图片
style

xml:

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="vertical"

    android:layout_centerInParent="true"

    android:paddingTop="16dp"

    android:background="@drawable/base_dialog_bg"

    xmlns:tools="http://schemas.android.com/tools">

        android:id="@+id/title"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center"

        android:layout_marginLeft="16dp"

        android:layout_marginRight="16dp"

        android:layout_marginBottom="16dp"

        android:gravity="center"

        tools:text="消息提示"

        android:visibility="visible"

        android:textColor="#333333"

        android:textSize="18sp" />

        android:id="@+id/image"

        tools:src="@mipmap/ic_launcher"

        android:layout_gravity="center"

        android:maxHeight="150dp"

        android:maxWidth="150dp"

        android:layout_marginBottom="10dp"

        android:layout_marginLeft="16dp"

        android:layout_marginRight="16dp"

        android:visibility="visible"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content" />

        android:layout_gravity="center"

        android:layout_width="300dp"

        android:layout_height="400dp">

            android:id="@+id/message"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:gravity="center|left"

            android:layout_marginLeft="20dp"

            android:layout_marginRight="20dp"

            android:lineSpacingExtra="3dp"

            android:lineSpacingMultiplier="1.2"

            android:textSize="14dp"

            android:textColor="#999999"

            tools:text="提示消息" />

        android:id="@+id/privacy"

        android:textSize="@dimen/dp_14"

        android:textColor="#38ADFF"

        android:layout_marginTop="@dimen/dp_16"

        android:layout_gravity="center"

        android:text="隐私政策"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"/>

        android:layout_width="match_parent"

        android:layout_height="1px"

        android:layout_marginTop="16dp"

        android:background="#E4E4E4" />

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

            android:id="@+id/negtive"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_marginLeft="10dp"

            android:paddingTop="16dp"

            android:paddingBottom="16dp"

            android:layout_weight="1"

            android:background="@null"

            android:gravity="center"

            android:singleLine="true"

            tools:text="No"

            android:textColor="#999999"

            android:textSize="16sp" />

            android:id="@+id/column_line"

            android:layout_width="1px"

            android:layout_height="match_parent"

            android:background="#E4E4E4" />

            android:id="@+id/positive"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_marginRight="10dp"

            android:layout_weight="1"

            android:paddingTop="16dp"

            android:paddingBottom="16dp"

            android:background="@null"

            android:gravity="center"

            android:singleLine="true"

            tools:text="Yes"

            android:textColor="#38ADFF"

            android:textSize="16sp" />


以上为止,我们所需的东西就全部凑齐了。接下来看用法:

在我们需要弹窗的Activity或者fragment中创建一个方法:initDialog();

方法中,new一个我们刚创建的Dialog类。

CommonDialog commonDialog =new CommonDialog(上下文对象);

commonDialog .setTitle("标题")

                          .setMessage("提示内容")

                          .setSingle(true/false)//false为双选,true为单选。看自己需求

                          .setOnClickBottomListener(new CommonDialog.OnClickBottomListener()){

                                @Override

                                    public void onPositiveClick() {

                                    startActivity(MainActivity.class);//做你想做的事。

                                    finish();

                                    }

                                @Override

                                public void onNegtiveClick() {

                                //退出程序

                                System.exit(0);

                            }

                   }).show();


        //当Dialog出现时,返回键失效

        commonDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {

            @Override

            public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) {

                    if(keyEvent.getKeyCode()==KeyEvent.KEYCODE_BACK){

                            return true;

                    }

                            return false;

                }

        });

好了,到这里,一个简单的自定义Dialog就完成了,赶紧拿去试试吧。

注意:具体需求,直接改动就可以。代码简单也好懂。

你可能感兴趣的:(Android之简单的实现一个自定义Dialog)