Android Dialog仿ios9中UIAlertController控件

来源:互联网 发布:国际金价软件 编辑:程序博客网 时间:2024/06/05 22:55

Android Dialog仿ios9中UIAlertController控件

最近因为项目需要,用Android Dialog仿ios9中的UIAlertController控件,第一次对自定义控件进行封装,请大家多多指教

如图所示,当我封装的Dialog被触发时,从底部弹出,点击取消键整个弹框会消失,当点击不同的TextView会有相应的点击事件发生,目前只写了三个能被点击的TextView(以后会改为可以动态添加个数)。
以下代码是我封装的BottomDialog:

public class BottomDialog extends Dialog {    private TextView mTitleTv;    private TextView mOneTv;    private TextView mTwoTv;    private TextView mCancelTv;    private Dialog myDialog;    private ClickListenerInterface clickListenerInterface;    public interface ClickListenerInterface {        void onTitleClick();//点击标题TextView        void onOneClick();//点击第一个TextView        void onTwoClick();//点击第二个TextView    }    public BottomDialog(@NonNull Context context) {        super(context);        init();    }    public BottomDialog(@NonNull Context context, @StyleRes int themeResId) {        super(context, themeResId);        init();    }    protected BottomDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {        super(context, cancelable, cancelListener);        init();    }    private void init() {        myDialog = new Dialog(getContext(), R.style.BottomDialogStyle);        //填充对话框的布局        View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_bottom, null);        //初始化控件        mTitleTv = (TextView) view.findViewById(R.id.tv_dialog_title);        mOneTv = (TextView) view.findViewById(R.id.tv_dialog_one);        mTwoTv = (TextView) view.findViewById(R.id.tv_dialog_two);        mCancelTv = (TextView) view.findViewById(R.id.tv_dialog_cancel);        mTitleTv.setOnClickListener(new DialogClickListener());        mOneTv.setOnClickListener(new DialogClickListener());        mTwoTv.setOnClickListener(new DialogClickListener());        mCancelTv.setOnClickListener(new DialogClickListener());        //将布局设置给Dialog        myDialog.setContentView(view);        //获取当前Activity所在的窗体        Window dialogWindow = myDialog.getWindow();        //设置Dialog从窗体底部弹出        dialogWindow.setGravity(Gravity.BOTTOM);        //获得窗体的属性        WindowManager.LayoutParams lp = dialogWindow.getAttributes();        lp.width = (int) (dialogWindow.getWindowManager().getDefaultDisplay().getWidth() * 0.95);        lp.y = 20; //设置Dialog距离底部的距离        dialogWindow.setAttributes(lp); //将属性设置给窗体        myDialog.show();//显示对话框    }    public void setClicklistener(ClickListenerInterface clickListenerInterface) {        this.clickListenerInterface = clickListenerInterface;    }    private class DialogClickListener implements View.OnClickListener {        @Override        public void onClick(View v) {            switch (v.getId()) {                case R.id.tv_dialog_title:                    clickListenerInterface.onTitleClick();                    break;                case R.id.tv_dialog_one:                    clickListenerInterface.onOneClick();                    break;                case R.id.tv_dialog_two:                    clickListenerInterface.onTwoClick();                    break;                case R.id.tv_dialog_cancel:                    myDialog.dismiss();                    break;            }        }    }    public void dismissDialog() {        if (myDialog != null && myDialog.isShowing()) {            myDialog.dismiss();        }    }    /**     * 设置标题栏文本文字     *     * @param stringId     * @see #setTitleText(String)     */    public void setTitleText(@StringRes int stringId) {        setTitleText(getContext().getString(stringId));    }    /**     * 设置标题栏文本文字     *     * @param text     */    public void setTitleText(String text) {        mTitleTv.setText(text);        mTitleTv.setVisibility(View.VISIBLE);    }    /**     * 设置第一个TextView文字     *     * @param stringId     */    public void setOneText(@StringRes int stringId) {        setOneText(getContext().getString(stringId));    }    /**     * 设置第一个TextView文字     *     * @param text     */    public void setOneText(String text) {        mOneTv.setText(text);        mOneTv.setVisibility(View.VISIBLE);    }    /**     * 设置第二个TextView文字     *     * @param stringId     */    public void setTwoText(@StringRes int stringId) {        setTwoText(getContext().getString(stringId));    }    /**     * 设置第二个TextView文字     *     * @param text     */    public void setTwoText(String text) {        mTwoTv.setText(text);        mTwoTv.setVisibility(View.VISIBLE);    }    /**     * 获取标题栏文本     *     * @return     */    public final TextView getTitleTv() {        return mTitleTv;    }    /**     * 获取第一个文本     *     * @return     */    public final TextView getOneTv() {        return mOneTv;    }    /**     * 获取第二个文本     *     * @return     */    public final TextView getTwoTv() {        return mTwoTv;    }    /**     * 设置字体颜色     *     * @param titleColor 标题的颜色,默认是灰色     * @param otherColor 其他的颜色,默认是蓝色     * @param i          有2种模式,1(标题和其他颜色不一样)2(标题和其他颜色一样,取消键不一样)     */    public void setColor(int titleColor, int otherColor, int i) {        if (i == 1) {            mTitleTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));            mOneTv.setTextColor(ContextCompat.getColor(getContext(), otherColor));            mTwoTv.setTextColor(ContextCompat.getColor(getContext(), otherColor));        }        if (i == 2) {            mTitleTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));            mOneTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));            mTwoTv.setTextColor(ContextCompat.getColor(getContext(), titleColor));            mCancelTv.setTextColor(ContextCompat.getColor(getContext(), otherColor));        }    }    @Override    public void onProvideKeyboardShortcuts(List<KeyboardShortcutGroup> data, @Nullable Menu menu, int deviceId) {    }}

在Activity中的应用:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private BottomDialog bottomDialog;    private Button mButton;    private TextView mTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mButton = (Button) findViewById(R.id.button);        mTextView = (TextView) findViewById(R.id.textView);        mButton.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.button:                    showBottomDialog();                break;        }    }    /**     * 展示     */    private void showBottomDialog() {        bottomDialog = new BottomDialog(this);        bottomDialog.setClicklistener(new BottomDialog.ClickListenerInterface() {            @Override            public void onTitleClick() {            }            @Override            public void onOneClick() {                mTextView.setText(bottomDialog.getOneTv().getText().toString());            }            @Override            public void onTwoClick() {                mTextView.setText(bottomDialog.getTwoTv().getText().toString());            }        });    }}

被封装的Dialog主要提供的方法有:修改相应的TextView文字和颜色,提供点击相应的TextView的点击事件。

这里的点击事件主要用的是回调的方法,在Dialog中定义一个接口,在点击事件调用这个接口,当在Activity中触发这个回调接口时,点击事件产生。

主要代码是:

 private ClickListenerInterface clickListenerInterface;    public interface ClickListenerInterface {        void onTitleClick();//点击标题TextView        void onOneClick();//点击第一个TextView        void onTwoClick();//点击第二个TextView    }     public void setClicklistener(ClickListenerInterface clickListenerInterface) {        this.clickListenerInterface = clickListenerInterface;    } private class DialogClickListener implements View.OnClickListener {        @Override        public void onClick(View v) {            switch (v.getId()) {                case R.id.tv_dialog_title:                    clickListenerInterface.onTitleClick();                    break;                case R.id.tv_dialog_one:                    clickListenerInterface.onOneClick();                    break;                case R.id.tv_dialog_two:                    clickListenerInterface.onTwoClick();                    break;                case R.id.tv_dialog_cancel:                    myDialog.dismiss();                    break;            }        }    }

最后说一下更改文字颜色的方法:

 public void setColor(int titleColor, int otherColor, int i) {}

第一个传的颜色是修改最上面的TextView,第二个传的颜色是修改其他的文字颜色,第三个参数是表明你选用哪种模式,分别传1或2,有2种模式

  1. 标题和其他颜色不一样
  2. 标题和其他颜色一样,取消键不一样

下面是我的Github地址

原创粉丝点击