dialogandroid_reactnative dialogandroid - CSDN
  • 几种常用的Dialog

    热门讨论 2020-07-14 17:25:17
    一个常用的对话框大全
  • Android之UI--打造万能自定义Dialog

    万次阅读 2016-07-02 15:05:54
    本文出自:【冯帅的CSDN博客】在我们开发app的时候,很多地方需要弹出一个对话框,我们要不就直接用系统的Dialog或者就是AlertDialog,但是美工给我们的效果图片很多都是无法去实现的。接下来我们来看下自定义Dialog的...

    转载请标明出处:
    http://blog.csdn.net/android_it/article/details/51161038
    本文出自:【老甩哥的CSDN博客】

    在我们开发app的时候,很多地方需要弹出一个对话框,我们要不就直接用系统的Dialog或者就是AlertDialog,但是美工给我们的效果图片很多都是无法去实现的。接下来我们来看下自定义Dialog的使用方法:首先我给大家展示2个图片:
    这里写图片描述 这里写图片描述

    上面的2组图片使我们开发app经常需要的弹窗展示,四周是圆角,ios几乎都是这个效果,里面的文字信息,颜色都可以改变。接下来我们逐一的进行讲解怎么去自定义Dialog做出这样子的效果:
    一:首先我们要在values文件styles下,来写dialog的风格:

     <!-- dialog样式 -->
        <style name="dialog_custom" parent="@android:style/Theme.Dialog">
            <item name="android:windowIsFloating">true</item>    <!--是否浮在界面上-->
            <item name="android:windowIsTranslucent">true</item> <!--是否半透明-->
            <item name="android:windowNoTitle">false</item>       <!--是否有标题-->
            <item name="android:windowBackground">@android:color/transparent</item> <!--窗口背景色透明-->
            <item name="android:backgroundDimEnabled">false</item> <!--背景是否模糊显示-->
        </style>
    
    <!-- dialog底部弹出菜单动画 -->
        <style name="bottom_menu_animation" parent="android:Animation">
            <item name="@android:windowEnterAnimation">@anim/bottom_menu_enter</item>
            <item name="@android:windowExitAnimation">@anim/bottom_menu_exit</item>
        </style>

    大家可以看到我在styles里面还加了一个动画效果风格,这个在后面自定义Dialog的时候会用到。@anim/bottom_menu_enter和@anim/bottom_menu_exit 分别是在res下建一个anim包添加了2个文件bottom_menu_enter和bottom_menu_exit :
    在bottom_menu_enter下:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
        <translate
            android:duration="400"
            android:fromYDelta="100%p" />
    </set>

    在bottom_menu_exit 下:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
        <translate
            android:duration="600"
            android:toYDelta="100%p" />
    </set>

    上面的动画我就不在阐述了,继续朝下说:
    首先我们先想下,自定义一个Dialog,首先要继承Dialog,然后就是要有构造方法,然后重写里面的某些方法,其实就是这样子。如果我们在某个Activity或者Fragment里面想要这个自定义Dialog的话,那么我们就要new这个自定义的Dialog。
    那么我们就很自然的想到我们需要一个Context上下文,一个布局文件,如果我们还要操作布局里面的文件的话,那我们还要布局文件里面的id和监听事件;
    说到这里:我们就开始一步一步的去写这个自定义的文件:
    我们起一个自定义Dialog叫CenterDialog:

     private Context context;      // 上下文
     private int layoutResID;      // 布局文件id
     private int[] listenedItems;  // 要监听的控件id
    
     public CenterDialog(Context context, int layoutResID, int[] listenedItems) {
            super(context, R.style.dialog_custom); //dialog的样式
            this.context = context;
            this.layoutResID = layoutResID;
            this.listenedItems = listenedItems;
        }

    通过上面的分析,我们已经把Context,布局文件,布局文件里面的控件id还有构造方法都写好了,这里说下,因为布局文件里面的id控件会有很多,所有写了一个int[]数组。

    接下来我们重写onCreate()方法:

    @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(layoutResID);
    
            WindowManager windowManager = ((Activity) context).getWindowManager();
            Display display = windowManager.getDefaultDisplay();
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.width = display.getWidth()*4/5; // 设置dialog宽度为屏幕的4/5
            getWindow().setAttributes(lp);
            setCanceledOnTouchOutside(true);// 点击Dialog外部消失
            //遍历控件id,添加点击事件
            for (int id : listenedItems) {
                findViewById(id).setOnClickListener(this);
            }
        }
    

    接下来就是让CenterDialog implements View.OnClickListener重写onClick()方法,到这里我们再想下,如果想在外部要监听布局文件控件的事件,首先我们要对CenterDialog添加监听事件,然后才可以进行控制控件的监听事件?怎么做呢?
    如果java学的好的话,很明显我们要在这里面写个接口,然后添加一个方法,让外部重写,那下面我们看下代码:

     private OnCenterItemClickListener listener;
     public interface OnCenterItemClickListener {
            void OnCenterItemClick(CenterDialog dialog, View view);
        }
     public void setOnCenterItemClickListener(OnCenterItemClickListener listener) {
            this.listener = listener;
        }
    
      @Override
        public void onClick(View view) {
            dismiss();//注意:我在这里加了这句话,表示只要按任何一个控件的id,弹窗都会消失,不管是确定还是取消。
            listener.OnCenterItemClick(this, view);
        }

    好了,自定义的CenterDialog已经书写完毕,那我们调用看看:
    首先写个简单的布局:activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#F0EFF5">
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="点击" />
    </LinearLayout>

    然后再写个dialog布局:dialog_layout.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/dialog_center_background"
        android:gravity="center_horizontal"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/dialog_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:layout_marginTop="20dp"
            android:text="需要写的信息"
            android:textColor="#F88833"
            android:textSize="20sp" />
    
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#cecece" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">
    
            <TextView
                android:id="@+id/dialog_cancel"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="取消"
                android:textColor="#6FBF6A"
                android:textSize="20sp" />
    
            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="#cecece" />
    
            <TextView
                android:id="@+id/dialog_sure"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="确定"
                android:textColor="#6FBF6A"
                android:textSize="20sp" />
        </LinearLayout>
    
    </LinearLayout>

    在MainActivity里面:我们new出CenterDialog对象,并添加点击事件:

    package com.fshsoft.dialogdemo;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener, CenterDialog.OnCenterItemClickListener {
    
        private Button button;
        private CenterDialog centerDialog;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(this);
            centerDialog = new CenterDialog(this, R.layout.dialog_layout,
             new int[]{R.id.dialog_cancel, R.id.dialog_sure});
            centerDialog.setOnCenterItemClickListener(this);
    
        }
    
        @Override
        public void onClick(View v) {
            centerDialog.show();
        }
    
        @Override
        public void OnCenterItemClick(CenterDialog dialog, View view) {
               case R.id.dialog_sure:
                    Toast.makeText(MainActivity.this,"确定按钮",Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
        }
    }
    

    在OnCenterItemClick();里面我没有进行取消按钮的判断,是因为在自定义的CenterDialog里面我已经把所有控件的id,点击都dismiss了,前面已经提到了。

    以上就是自定义dialog的内容,到这里,也许你会说,我的布局里面需要一个取消按钮,但是不是确定,是添加图片这个字,我不可能再去写个布局把,你说的对,我们可以这样子做:

    new int[]{R.id.dialog_cancel, R.id.dialog_sure});
      centerDialog.show();
      TextView dialog_sure = (TextView) centerDialog.findViewById(R.id.dialog_sure);
      dialog_sure.setText("添加图片");

    这里需要注意的事就是,需要先把dialog给show()出来,然后通过centerDialog.findViewById(R.id.dialog_sure);才能拿到控件对象,然后在setText(“添加图片”);当然还可以改变字体的颜色等等信息,这里就不再列举。

    以上就是全部内容,写到这里,你可以尝试写下第二张图片的dialog.

    不足之处请留言指正!有问题的可以给我留言!谢谢!

    下载源码

    展开全文
  • Android Dialog封装

    2019-08-05 13:47:21
    先看效果 具体使用 CommonDialogBuilder(this, R.style.CommonDialogStyleTest).withType(CommonDialogBuilder.NOTITLE_ONLY) .withTitle("标题") .withMessage("消息") .withNegative { ...

    先看效果

    在这里插入图片描述

    具体使用

     CommonDialogBuilder(this, R.style.CommonDialogStyleTest).withType(CommonDialogBuilder.NOTITLE_ONLY)
                .withTitle("标题")
                .withMessage("消息")
                .withNegative { view, dialog ->
                    toast("点击了取消,没有数据")
                }
                .withNegative { view, dialog, data ->
     				toast("点击了取消,有数据")
                }
                .withPositive { view, dialog ->
                     toast("点击了确定,没有数据")
                }
                .withPositive { view, dialog, data ->
                      toast("点击了确定,有数据")
                }
                .withAnimStyle(R.style.dialogAnimation)  //设置动画
                .show()
    

    部分代码

    Dialog的封装,主要是项目中会有多个自定义Dialog,不需要每个自定义Dialog都需要重写,只需要继承好自己封装好的BaseDialog就可以了。

    这里提供了一个实现好的封装Dialog也就是CommonDialog,大家可以直接使用。
    如果需要自定义Dialog,继承BaseDialogBuilderBaseDialog。这里具体的实现参照CommonDialogCommonDialogBuilder即可。

    下面贴出封装的部分基类代码:全部代码请移步:GitHub

    BaseDialogBuilder

    abstract class BaseDialogBuilder<B, D : BaseDialogInterface>(var context: Context, var style: Int) {
    
        //初始化 Builder
        abstract var dialogBuilder: B
    
        //初始化Dialog
        abstract fun build(): D
    
        open var dialog: D? = null
    
        //标题
        open var title: String? = null
        //消息
        open var message: String? = null
        //dialog宽度
        open var width = WindowManager.LayoutParams.MATCH_PARENT
        //dialog高度
        open var height = WindowManager.LayoutParams.WRAP_CONTENT
        open var gravity = Gravity.CENTER
    
        open var isCancelable = true//点击空白区域是否消失。默认消失
    
        open var animStyle = 0//进入退出动画
    
        open var dimAmount = 1.1f //背景昏暗度
    
        //positive按钮。一般是右边的确定按钮。这个用户自定义。
        open var positiveStr: String? = null
        open var onPositiveDialogClickedListener: OnDialogClickedListener? = null
    
        //negative按钮。一般是左边的取消按钮。这个用户自定义。
        open var negativeStr: String? = null
        open var onNegativeDialogClickedListener: OnDialogClickedListener? = null
    
        open fun show(): D {
            if (dialog == null) {
                dialog = build()
            }
            dialog!!.show(this)
            return dialog!!
        }
    
        //设置标题
        open fun withTitle(title: String?): B {
            this.title = title
            return dialogBuilder
        }
    
        //设置标题
        open fun withTitle(@StringRes title: Int): B {
            this.title = context.getString(title)
            return dialogBuilder
        }
    
        //设置消息
        open fun withMessage(@StringRes message: Int): B {
            this.message = context.getString(message)
            return dialogBuilder
        }
    
        //设置消息
        open fun withMessage(message: String): B {
            this.message = message
            return dialogBuilder
        }
    
        open fun withCanCancel(canCancel: Boolean): B {
            this.isCancelable = canCancel
            return dialogBuilder
        }
    
        open fun withWidth(width: Int): B {
            this.width = width
            return dialogBuilder
        }
    
        open fun withHeight(height: Int): B {
            this.height = height
            return dialogBuilder
        }
    
        open fun withGravity(gravity: Int): B {
            this.gravity = gravity
            return dialogBuilder
        }
    
        //设置动画
        open fun withAnimStyle(animStyle: Int): B {
            this.animStyle = animStyle
            return dialogBuilder
        }
    
        //设置背景昏暗度
        open fun withDimAmount(@FloatRange(from = 0.0, to = 1.0) dimAmount: Float): B {
            this.dimAmount = dimAmount
            return dialogBuilder
        }
    
        open fun withPositive(positiveStr: String = "", onPositiveClicked: (view: View, dialog: Dialog) -> Unit?): B {
            this.positiveStr = positiveStr
            this.onPositiveDialogClickedListener = object : OnDialogClickedListener {
                override fun onClick(view: View, dialog: Dialog, data: Any?) {
                }
    
                override fun onClick(view: View, dialog: Dialog) {
                    onPositiveClicked(view, dialog)
                }
            }
            return dialogBuilder
        }
    
        open fun withPositive(positiveStr: String = "", onPositiveClicked: (view: View, dialog: Dialog, data: Any?) -> Unit?): B {
            this.positiveStr = positiveStr
            this.onPositiveDialogClickedListener = object : OnDialogClickedListener {
                override fun onClick(view: View, dialog: Dialog, data: Any?) {
                    onPositiveClicked(view, dialog, data)
                }
    
                override fun onClick(view: View, dialog: Dialog) {
                }
            }
            return dialogBuilder
        }
    
        open fun withPositive(@StringRes positiveStr: Int, onPositiveClicked: (view: View, dialog: Dialog) -> Unit?): B {
            this.positiveStr = context.getString(positiveStr)
            this.onPositiveDialogClickedListener = object : OnDialogClickedListener {
                override fun onClick(view: View, dialog: Dialog, data: Any?) {
    
                }
    
                override fun onClick(view: View, dialog: Dialog) {
                    onPositiveClicked(view, dialog)
                }
            }
            return dialogBuilder
        }
    
        open fun withPositive(@StringRes positiveStr: Int, onPositiveClicked: (view: View, dialog: Dialog, data: Any?) -> Unit?): B {
            this.positiveStr = context.getString(positiveStr)
            this.onPositiveDialogClickedListener = object : OnDialogClickedListener {
                override fun onClick(view: View, dialog: Dialog, data: Any?) {
                    onPositiveClicked(view, dialog, data)
                }
    
                override fun onClick(view: View, dialog: Dialog) {
    
                }
            }
            return dialogBuilder
        }
    
        open fun withNegative(negativeStr: String = "", onNegativeClicked: (view: View, dialog: Dialog) -> Unit?): B {
            this.negativeStr = negativeStr
            this.onNegativeDialogClickedListener = object : OnDialogClickedListener {
                override fun onClick(view: View, dialog: Dialog, data: Any?) {
    
                }
    
                override fun onClick(view: View, dialog: Dialog) {
                    onNegativeClicked(view, dialog)
                }
            }
            return dialogBuilder
        }
    
        open fun withNegative(negativeStr: String = "", onNegativeClicked: (view: View, dialog: Dialog, data: Any?) -> Unit?): B {
            this.negativeStr = negativeStr
            this.onNegativeDialogClickedListener = object : OnDialogClickedListener {
                override fun onClick(view: View, dialog: Dialog, data: Any?) {
                    onNegativeClicked(view, dialog, data)
                }
    
                override fun onClick(view: View, dialog: Dialog) {
    
                }
            }
            return dialogBuilder
        }
    
        open fun withNegative(@StringRes negativeStr: Int, onNegativeClicked: (view: View, dialog: Dialog) -> Unit?): B {
            this.negativeStr = context.getString(negativeStr)
            this.onNegativeDialogClickedListener = object : OnDialogClickedListener {
                override fun onClick(view: View, dialog: Dialog, data: Any?) {
    
                }
    
                override fun onClick(view: View, dialog: Dialog) {
                    onNegativeClicked(view, dialog)
                }
            }
            return dialogBuilder
        }
    
        open fun withNegative(@StringRes negativeStr: Int, onNegativeClicked: (view: View, dialog: Dialog, data: Any?) -> Unit?): B {
            this.negativeStr = context.getString(negativeStr)
            this.onNegativeDialogClickedListener = object : OnDialogClickedListener {
                override fun onClick(view: View, dialog: Dialog, data: Any?) {
                    onNegativeClicked(view, dialog, data)
                }
    
                override fun onClick(view: View, dialog: Dialog) {
    
                }
            }
            return dialogBuilder
        }
    
        open fun destroy() {
            onNegativeDialogClickedListener = null
            onPositiveDialogClickedListener = null
            if (dialog != null) {
                if (dialog!!.dialogIsShow()) {
                    dialog!!.dismissDialog()
                }
                dialog!!.cancelDialog()
                dialog = null
            }
        }
    }
    

    BaseDialog

    abstract class BaseDialog<T : BaseDialogBuilder<*, *>>(context: Context, style: Int) : AlertDialog(context, style), BaseDialogInterface {
    
        open lateinit var dialogBuilder: T
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(setContentView())
            initDialog()
            bindView(savedInstanceState)
        }
    
        open fun initDialog() {
            window?.let {
                var params = it.attributes
                params.gravity = dialogBuilder.gravity
                params.width = dialogBuilder.width
                params.height = dialogBuilder.height
                if (dialogBuilder.animStyle != 0) it.setWindowAnimations(dialogBuilder.animStyle)
                if (dialogBuilder.dimAmount in 0.0..1.0) params.dimAmount = dialogBuilder.dimAmount
                it.attributes = params
            }
        }
    
        abstract fun bindView(saveInstanceState: Bundle?)
    
        abstract fun setContentView(): Int
    
        @Suppress("UNCHECKED_CAST")
        override fun show(baseDialogBuilder: BaseDialogBuilder<*, *>): Dialog? {
            this.dialogBuilder = baseDialogBuilder as T
            this.setCanceledOnTouchOutside(baseDialogBuilder.isCancelable)
            this.show()
            return this
        }
    
        override fun dismissDialog() {
            this.dismiss()
        }
    
        override fun dialogIsShow(): Boolean {
            return isShowing
        }
    
        override fun cancelDialog() {
            this.cancel()
        }
    }
    


    全部代码请移步:GitHub欢迎大家star

    展开全文
  • Android Dialog弹出对话框整理总结

    千次阅读 2018-08-30 15:52:52
    对话框的概念: 对话框是提示用户作出决定,输入额外信息或显示某种状态的小窗口,通常不会... Dialog类是dialog对话框的基类,Dialog基类中并没有定义界面,所以如果使用dialog类设置弹出框,需要使用xml自定义...

    对话框的概念:

    对话框是提示用户作出决定,输入额外信息或显示某种状态的小窗口,通常不会填充整个屏幕,用于进行一些额外交互。

    对话框的特点:

    1, 当前界面弹出的小窗口.

    2, 用户要与它进行交互, 可以接收用户输入的信息, 也可以反馈信息给用户.

        Dialog类是dialog对话框的基类,Dialog基类中并没有定义界面,所以如果使用dialog类设置弹出框,需要使用xml自定义UI。系统自带了几个dialog派生的弹出框,并设置好了UI,可以直接调用系统自带的dialog衍生品,具体如下。除此之外,activity和fragment也可以作为dialog样式弹出使用,比如DialogFragment,使用 DialogFragment 管理对话框可确保它能正确处理生命周期事件,如用户按“返回”按钮或旋转屏幕时。

    java.lang.Object
    ↳  android.app.Dialog
    Known Direct Subclasses
    AlertDialog, CharacterPickerDialog, MediaRouteChooserDialog, MediaRouteControllerDialog, Presentation
    
    Known Indirect Subclasses
    DatePickerDialog, ProgressDialog, TimePickerDialog

     

    使用Alert Dialog等衍生类定义对话框

    先上效果图:

          

    下面是代码:

    public class DialogActivity extends AppCompatActivity implements View.OnClickListener {
    
        private int choice = -1;
    
        public static void newInstance(Context context){
    
            Intent intent = new Intent(context, DialogActivity.class);
    //        intent.putExtra("data", data);
            context.startActivity(intent);
        }
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_dialog);
    
            Button btnAlertdialog = (Button) findViewById(R.id.btn_alertdialog);
            btnAlertdialog.setOnClickListener(this);
            Button btnAlertdialog2 = (Button) findViewById(R.id.btn_alertdialog2);
            btnAlertdialog2.setOnClickListener(this);
            Button btnSingleDialog = (Button) findViewById(R.id.btn_single_dialog);
            btnSingleDialog.setOnClickListener(this);
            Button btnMultiDialog = (Button) findViewById(R.id.btn_multi_dialog);
            btnMultiDialog.setOnClickListener(this);
            Button btnProgressDialog = (Button) findViewById(R.id.btn_progress_dialog);
            btnProgressDialog.setOnClickListener(this);
            Button btnProgressDialog2 = (Button) findViewById(R.id.btn_progress_dialog2);
            btnProgressDialog2.setOnClickListener(this);
            Button btnEditDialog = (Button) findViewById(R.id.btn_edit_dialog);
            btnEditDialog.setOnClickListener(this);
            Button btnCustomDialog = (Button) findViewById(R.id.btn_custom_dialog);
            btnCustomDialog.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
    
            switch (v.getId()){
    
                /**
                 * 普通的 AlertDialog
                 */
                case R.id.btn_alertdialog:
                    AlertDialog.Builder dialog = new AlertDialog.Builder(this);
                    dialog.setIcon(R.mipmap.ic_launcher_round);
                    dialog.setTitle("普通 AlertDialog");
                    dialog.setMessage("Dialog对话框之:\n AlertDialog");
                    dialog.setCancelable(false);    //设置是否可以通过点击对话框外区域或者返回按键关闭对话框
                    dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(DialogActivity.this, "确定", Toast.LENGTH_SHORT).show();
                        }
                    });
                    dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(DialogActivity.this, "取消", Toast.LENGTH_SHORT).show();
                        }
                    });
    
                    //3个按钮
    //                dialog.setNeutralButton("等待", new DialogInterface.OnClickListener() {
    //                    @Override
    //                    public void onClick(DialogInterface dialog, int which) {
    //                        Toast.makeText(DialogActivity.this, "等待", Toast.LENGTH_SHORT).show();
    //                    }
    //                });
                    dialog.show();
                    break;
                /**
                 * 列表的 AlertDialog
                 */
                case R.id.btn_alertdialog2:
                    final String[] items = { "列表1", "列表2", "列表3" };
                    AlertDialog.Builder listDialog = new AlertDialog.Builder(this);
                    listDialog.setIcon(R.mipmap.ic_launcher_round);
                    listDialog.setTitle("列表 AlertDialog");
                    listDialog.setItems(items, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //which下标从0开始, 代表当前选择的Item下标
                            Toast.makeText(DialogActivity.this, "你点击了:" + items[which], Toast.LENGTH_SHORT).show();
                        }
                    });
                    listDialog.show();
                    break;
                /**
                 * 单选 AlertDialog
                 * 备注:匿名类可以访问外部类的所有成员,包裹该匿名类的方法中的所有final类型的局部变量。
                 *      此处的 choice 变量若定为局部变量,则必须声明为final类型,但是这样就不能完成匿名类内部赋值,故声明为外部属性
                 */
                case R.id.btn_single_dialog:
                    final String[] item = { "单选1", "单选2", "单选3" };
                    AlertDialog.Builder singleDialog = new AlertDialog.Builder(this);
                    singleDialog.setIcon(R.mipmap.ic_launcher_round);
                    singleDialog.setTitle("单选 AlertDialog");
                    singleDialog.setSingleChoiceItems(item, 0, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            choice = which;
                        }
                    });
                    singleDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                Toast.makeText(DialogActivity.this, "你选择了:" + item[choice], Toast.LENGTH_SHORT).show();
                        }
                    });
                   singleDialog.show();
                    break;
                /**
                 * 多选 AlertDialog
                 * 备注:Boolean 是boolean 的实例化对象类,和Integer对应int一样
                 */
                case R.id.btn_multi_dialog:
                    final String[] multiItem = {"多选1", "多选2", "多选3"};
                    final boolean[] checkedItem = {false, false, false};   //基础不牢固,boolean写错成Boolean搞了半天
                    AlertDialog.Builder multiDialog = new AlertDialog.Builder(this);
                    multiDialog.setIcon(R.mipmap.ic_launcher_round);
                    multiDialog.setTitle("多选 AlertDialog");
                    multiDialog.setMultiChoiceItems(multiItem, checkedItem, new DialogInterface.OnMultiChoiceClickListener(){
                        @Override
                        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                           checkedItem[which] = isChecked;
                        }
                    });
                    multiDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            StringBuilder str = new StringBuilder();
                            for (int i=0; i<checkedItem.length; i++ ){
                                if (checkedItem[i]){
                                    str.append(multiItem[i]);
                                }
                            }
                            Toast.makeText(DialogActivity.this, "你选择了:" + str , Toast.LENGTH_SHORT).show();
                        }
                    });
                    multiDialog.show();
                    break;
                /**
                 * 等待 ProgressDialog
                 * 可以用于下载等事件完成后,主动调用函数关闭该Dialog
                 */
                case R.id.btn_progress_dialog:
                    ProgressDialog waitDialog = new ProgressDialog(this);
                    waitDialog.setIcon(R.mipmap.ic_launcher_round);
                    waitDialog.setTitle("等待 ProgressDialog");
                    waitDialog.setMessage("请稍等");
                    waitDialog.setProgressStyle(STYLE_SPINNER);
                    waitDialog.setCancelable(true);
                    waitDialog.show();
                    break;
                /**
                 * 进度条 ProgressDialog
                 * 可以在子线程中直接调用setProgress方法更新UI,这个方法内已经处理了子线程里调用的情况了
                 */
                case R.id.btn_progress_dialog2:
                    final ProgressDialog progressDialog = new ProgressDialog(this);
                    progressDialog.setIcon(R.mipmap.ic_launcher_round);
                    progressDialog.setTitle("进度条 ProgressDialog");
                    progressDialog.setMessage("正在加载,请稍后……");
                    progressDialog.setIndeterminate(false); //设置是否进入模糊状态,可以设置为true看看
                    progressDialog.setMax(80);
                    progressDialog.setProgressStyle(STYLE_HORIZONTAL);
                    progressDialog.show();
                    progressDialog.setProgress(0); //设置进度值, 在显示对话后,才可以设置
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            int progress = 0;
                            while (progress < 80){
                                try {
                                    Thread.sleep(100);
                                    progress++;
                                    progressDialog.setProgress(progress);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                            progressDialog.dismiss();
                        }
                    }).start();
                    break;
                /**
                 * 编辑 AlertDialog
                 * @setView 方法装入了一个EditText
                 * 该方法其实就是替换标题和下方按钮中间的那部分布局
                 */
                case R.id.btn_edit_dialog:
                    final EditText editText = new EditText(this);
                    AlertDialog.Builder editDialog = new AlertDialog.Builder(this);
                    editDialog.setIcon(R.mipmap.ic_launcher_round);
                    editDialog.setTitle("编辑 AlertDialog").setView(editText);
                    editDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(DialogActivity.this, "输入的内容为:" + editText.getText().toString(), Toast.LENGTH_SHORT).show();
                        }
                    });
                    editDialog.show();
                    break;
                /**
                 * 自定义 AlertDialog
                 * 添加的自定义布局实际上修改的也只是标题和下方按钮中间的那部分布局,标题和按钮都还用Android原生的
                 */
                case R.id.btn_custom_dialog:
                    AlertDialog.Builder customDialog = new AlertDialog.Builder(this);
                    customDialog.setIcon(R.mipmap.ic_launcher_round);
                    //填充设置好的自定义布局
                    View dialogView = getLayoutInflater().inflate(R.layout.dialog_custom, null);
                    Button growth = (Button) dialogView.findViewById(R.id.btn_growth);
                    growth.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Toast.makeText(DialogActivity.this, "好好学习,努力沉淀", Toast.LENGTH_SHORT).show();
                        }
                    });
                    customDialog.setTitle("自定义 AlertDialog");
                    customDialog.setView(dialogView);
                    customDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    
                        }
                    });
                    //该方法会返回一个AlertDialog对象,可以用来调用dismiss方法
                    //AlertDialog alertDialog = new AlertDialog.Builder(this).create();或者通过该方式创建AlertDialog
                    customDialog.show();
                    break;
                /**
                 * 日期 DatePickerDialog
                 * 不同系统版本该控件样式风格也不同
                 */
                case R.id.btn_date_dialog:
                    //获取系统的当前日期
                    Calendar calendar = Calendar.getInstance();
                    int year = calendar.get(Calendar.YEAR);
                    int month = calendar.get(Calendar.MONTH);
                    int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
    
                    DatePickerDialog dateDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                            Toast.makeText(DialogActivity.this, year + "年" + (month+1) + "月" + dayOfMonth + "日", Toast.LENGTH_SHORT).show();
                        }
                    }, year, month, dayOfMonth);
                    dateDialog.show();
                    break;
                /**
                 * 时间 TimePickerDialog
                 */
                case R.id.btn_time_dialog:
                    //获取系统当前时间
                    Calendar calendar1 = Calendar.getInstance();
                    int hour = calendar1.get(Calendar.HOUR_OF_DAY);
                    int minute = calendar1.get(Calendar.MINUTE);
    
                    TimePickerDialog timeDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                            Toast.makeText(DialogActivity.this, hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show();
                        }
                    }, hour, minute, true);
                    timeDialog.show();
                    break;
                /**
                 * 日期时间对话框
                 * 如果把时间对话框部分放在DatePickerDialog中会出现,timePickerDialog显示两次的情况
                 */
                case R.id.btn_date_time_dialog:
                    Calendar calendar2 = Calendar.getInstance();
                    int year2 = calendar2.get(Calendar.YEAR);
                    int month2 = calendar2.get(Calendar.MONTH);
                    int dayOfMonth2 = calendar2.get(Calendar.DAY_OF_MONTH);
                    int hour2 = calendar2.get(Calendar.HOUR_OF_DAY);
                    int minute2 = calendar2.get(Calendar.MINUTE);
    
                    DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                            Toast.makeText(DialogActivity.this, year + "年" + (month+1) + "月" + dayOfMonth + "日", Toast.LENGTH_SHORT).show();
                        }
                    }, year2, month2, dayOfMonth2);
                    TimePickerDialog timePickerDialog = new TimePickerDialog(DialogActivity.this, new TimePickerDialog.OnTimeSetListener() {
                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                            Toast.makeText(DialogActivity.this, hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show();
                            Log.e("DialogActivity", hourOfDay + ":" + minute);
                        }
                    }, hour2, minute2, true);
                    timePickerDialog.show();
                    datePickerDialog.show();
                    break;
                default:
                    break;
            }
        }
    }
    

     

    附上一些还不错的:

    https://www.cnblogs.com/xiaoluo501395377/p/3419398.html

    https://blog.csdn.net/u010694658/article/details/53022294

    https://blog.csdn.net/wjr1949/article/details/70959969

    使用Dialog定义对话框

    https://blog.csdn.net/xinxin__/article/details/78865874

    https://blog.csdn.net/zxhandroid/article/details/72851959

    使用DialogFragment定义对话框

    https://blog.csdn.net/luanpeng825485697/article/details/78657616

    https://blog.csdn.net/vampire2777/article/details/54917728

    https://blog.csdn.net/helang296479893/article/details/80094970

    https://blog.csdn.net/androidstarjack/article/details/73824885

    展开全文
  • 安卓dialog的使用+如何自定义dialog

    万次阅读 多人点赞 2018-06-19 22:42:28
    回到正题,看到产品给我的设计图,有辣么多的自定义的dialog,发现之前自己只会系统自带的dialog,但是这样根本满足不了产品的需求,所以自己上周好好总结下,然后把产品给的需求完成。//哇哇哇,项目写不完了 什么...

    吐槽

    哇哇哇,刚写一半win10给我蓝屏了,心塞塞,以后写一点保存一点。回到正题,看到产品给我的设计图,有辣么多的自定义的dialog,发现之前自己只会系统自带的dialog,但是这样根本满足不了产品的需求,所以自己上周好好总结下,然后把产品给的需求完成。//哇哇哇,项目写不完了

    什么叫dialog

    简单来说就是一句话:
    弹出一个窗口,提示用户自己去选择,去提示,去分类的一些内容。
    安卓自带的dialog有三种:
    这里写图片描述
    - AlertDialog—-普通的提示对话框
    - ProgressDialog–进度条对话
    - DatePickerDialog/TimePickerDialog–日期对话框/时间对话框

    所有的对话框,都是直接或间接继承自Dialog类,而AlterDialog直接继承自Dialog,其他的几个类均继承自AlterDialog。

    系统自带的dialog基本上用AlertDialog类
     AlertDialog继承自Dialog类,对于Android内置的AlterDialog,它可以包含一个标题、一个内容消息或者一个选择列表、最多三个按钮。而创建AlterDialog推荐使用它的一个内部类AlterDialog.Builder创 建。使用Builder对象,可以设置AlterDialog的各种属性,最后通过Builder.create()就可以得到AlterDialog对 象,如果只是还需要显示这个AlterDialog,一般可以直接使用Builder.show()方法,它会返回一个AlterDialog对象,并且 显示它。
    //说这么多,还不如直接看下如何用

    下面我会讲三个层次的dialog的使用:

    • 简单的系统dialog调用//就是简单的系统dialog的调用
    • 半自定义的dialog//就是改变一些基础属性
    • 完全自定义dialog//自定义dialog类,自己写界面,点击事件
      ##简单的系统dialog
      简单的dialog也分好多种,但是我只说AlertDialog类的
      ###普通对话框
      这个就是最普通的那种,让你选择正确或者错误,也可以选择中立,这个是最常见的那种
      这里写图片描述
      用法很简单
    • 第一步:new个AlertDialog.Builder
    • 第二步:设置dialog的图标,文字,提示信息
    • 第三步:设置不同选择的点击事件
    • 第四步:显示dialog
     /**
         * 普通dialog
         */
        private void showAlterDialog(){
            final AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this);
            alterDiaglog.setIcon(R.drawable.icon);//图标
            alterDiaglog.setTitle("简单的dialog");//文字
            alterDiaglog.setMessage("生存还是死亡");//提示消息
            //积极的选择
            alterDiaglog.setPositiveButton("生存", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了生存",Toast.LENGTH_SHORT).show();
                }
            });
            //消极的选择
            alterDiaglog.setNegativeButton("死亡", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了死亡",Toast.LENGTH_SHORT).show();
                }
            });
           //中立的选择
            alterDiaglog.setNeutralButton("不生不死", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了不生不死",Toast.LENGTH_SHORT).show();
                }
            });
    
            //显示
            alterDiaglog.show();
        }

    列表对话框

    直接看图吧
    这里写图片描述
    这个和普通的dialog差不多,只不过是从中数组选择一个确定点击事件

     /**
         * 列表Dialog
         */
        private void showListDialog(){
            final String[] items = {"我是1","我是2","我是3"};
            AlertDialog.Builder listDialog = new AlertDialog.Builder(MainActivity.this);
            listDialog.setIcon(R.drawable.icon);//图标
            listDialog.setTitle("我就是个列表Dialog");
            listDialog.setItems(items, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了"+items[which],Toast.LENGTH_SHORT).show();
                }
            });
            listDialog.show();
        }

    单选对话框

    它和列表对话框区别是前面有选择的圆点
    也是一样的
    这里写图片描述

     /**
         * 单选Dialog
         */
        int choice;
        private void showSingDialog(){
            final String[] items = {"我是1","我是2","我是3"};
            AlertDialog.Builder singleChoiceDialog = new AlertDialog.Builder(MainActivity.this);
            singleChoiceDialog.setIcon(R.drawable.icon);
            singleChoiceDialog.setTitle("我是单选Dialo");
            //第二个参数是默认的选项
            singleChoiceDialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    choice= which;
                }
            });
            singleChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (choice!=-1){
                        Toast.makeText(MainActivity.this,
                                "你选择了" + items[choice],
                                Toast.LENGTH_SHORT).show();
                    }
                }
            });
            singleChoiceDialog.show();
        }

    多选对话框

    在单选的基础上加了多选这个,就是选择的函数不一样
    这里写图片描述

     /**
         * 多选对话框
         */
        ArrayList<Integer> choices= new ArrayList<>();
        private void showMultiChoiceDialog(){
            final String[] items = {"我是1","我是2","我是3"};
            //设置默认选择都是false
            final boolean initchoices[] = {false,false,false};
            choices.clear();
            AlertDialog.Builder multChoiceDialog = new AlertDialog.Builder(MainActivity.this);
            multChoiceDialog.setIcon(R.drawable.icon);
            multChoiceDialog.setTitle("我是个多选Dialog");
            multChoiceDialog.setMultiChoiceItems(items, initchoices, new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                    if (isChecked){
                        choices.add(which);
                    }else {
                        choices.remove(which);
                    }
                }
            });
            multChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    int size = choices.size();
                    String str = "";
                    for(int i = 0;i<size;i++){
                        str+=items[choices.get(i)]+"";
                    }
                    Toast.makeText(MainActivity.this,
                            "你选中了" + str,
                            Toast.LENGTH_SHORT).show();
                }
            });
            multChoiceDialog.show();
        }

    等待对话框

    等待Dialog具有屏蔽其他控件的交互能力
    @setCancelable 为使屏幕不可点击,设置为不可取消(false) 
    下载等事件完成后,主动调用函数关闭该Dialog
    这里写图片描述 

     private void showProgressDialog(){
            final int MAX = 100;
            final ProgressDialog progressDialog = new ProgressDialog(this);
            progressDialog.setTitle("我是个等待的Dialog");
            progressDialog.setMessage("等待中");
            progressDialog.setIndeterminate(true);
            progressDialog.setCancelable(false);
            progressDialog.show();
        }

    进度条对话框

    就是和那些app上一样,简单的一个等待的框
    这里写图片描述

    /**
         * 进度条Dialog
         */
        private void showWhiteDialog(){
            /* @setProgress 设置初始进度
             * @setProgressStyle 设置样式(水平进度条)
             * @setMax 设置进度最大值
             */
            final int Max = 100;
            final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setProgress(0);
            progressDialog.setIcon(R.drawable.icon);
            progressDialog.setTitle("我是一个进度条Dialog");
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setMax(Max);
            progressDialog.show();
            /**
             * 开个线程
             */
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int p = 0;
                    while (p<Max){
                        try {
                            Thread.sleep(100);
                            p++;
                            progressDialog.setProgress(p);
                        }catch (InterruptedException e){
                            e.printStackTrace();
                        }
                    }
                    progressDialog.cancel();//达到最大就消失
                    }
    
            }).start();
        }

    半自定义对话框

    就是根据一些属性来自定义dialog,也可以添加自己的布局

    1控制不同普通的dialog的位置,大小,透明度

    这里写图片描述
    在不同的dialog的下面添加设置

     //自定义的东西
           //放在show()之后,不然有些属性是没有效果的,比如height和width
            Window dialogWindow = dialog.getWindow();
            WindowManager m = getWindowManager();
            Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
            WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
            // 设置高度和宽度
            p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6
            p.width = (int) (d.getWidth() * 0.6); // 宽度设置为屏幕的0.65
    
            p.gravity = Gravity.TOP;//设置位置
    
            p.alpha = 0.8f;//设置透明度
            dialogWindow.setAttributes(p);

    整体的代码:

     /**
         * 自定义1 控制普通的dialog的位置,大小,透明度
         * 在普通的dialog.show下面添加东西
         */
        private void DiyDialog1(){
            AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this);
            alterDiaglog.setIcon(R.drawable.icon);//图标
            alterDiaglog.setTitle("简单的dialog");//文字
            alterDiaglog.setMessage("生存还是死亡");//提示消息
            //积极的选择
            alterDiaglog.setPositiveButton("生存", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了生存",Toast.LENGTH_SHORT).show();
                }
            });
            //消极的选择
            alterDiaglog.setNegativeButton("死亡", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了死亡",Toast.LENGTH_SHORT).show();
                }
            });
    
            alterDiaglog.setNeutralButton("不生不死", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了不生不死",Toast.LENGTH_SHORT).show();
                }
            });
            AlertDialog dialog = alterDiaglog.create();
    
            //显示
            dialog.show();
            //自定义的东西
           //放在show()之后,不然有些属性是没有效果的,比如height和width
            Window dialogWindow = dialog.getWindow();
            WindowManager m = getWindowManager();
            Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
            WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
            // 设置高度和宽度
            p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6
            p.width = (int) (d.getWidth() * 0.6); // 宽度设置为屏幕的0.65
    
            p.gravity = Gravity.TOP;//设置位置
    
            p.alpha = 0.8f;//设置透明度
            dialogWindow.setAttributes(p);
        }

    自定义简单dialog的布局

    把自己写的xml加载进去
    这里写图片描述
    第一步:自定义布局
    自己定义dialog_1.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_centerInParent="true"
            android:background="#ed093a">
            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="自定义加强版的dialog"
                android:textColor="#fff"/>
        </LinearLayout>
    </RelativeLayout>

    第二步:在主活动里面设置dialog
    然后把这个布局扔进去

        /**
         * 自定义dialog2 简单自定义布局
         */
        private void DiyDialog2() {
            AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this,R.style.MyDialog);
            alterDiaglog.setView(R.layout.dialog_1);//加载进去
            AlertDialog dialog = alterDiaglog.create();
            //显示
            dialog.show();
            //自定义的东西
        }

    完全自定义dialog

    重要来到了最重头戏了,然后自定义dialog然后满足产品的需求,你只需要按照如下步骤来:
    这里写图片描述
    1.在values/styles.xml新建一个样式MyDialog

    <style name="MyDialog" parent="android:Theme.Dialog">
        <!-- 背景颜色及透明程度 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 是否半透明 -->
        <item name="android:windowIsTranslucent">false</item>
        <!-- 是否没有标题 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 是否背景模糊 -->
        <item name="android:backgroundDimEnabled">false</item>
        <!-- 设置背景模糊的透明度-->
        <item name="android:backgroundDimAmount">0.5</item>
    </style>

    2.新建一个MyDialog继承Dialog类

    public class MyDialog1 extends Dialog implements View.OnClickListener{
        //在构造方法里提前加载了样式
        private Context context;//上下文
        private int layoutResID;//布局文件id
        private int[] listenedItem;//监听的控件id
        public MyDialog1(Context context,int layoutResID,int[] listenedItem){
            super(context,R.style.MyDialog);//加载dialog的样式
            this.context = context;
            this.layoutResID = layoutResID;
            this.listenedItem = listenedItem;
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //提前设置Dialog的一些样式
            Window dialogWindow = getWindow();
            dialogWindow.setGravity(Gravity.CENTER);//设置dialog显示居中
            //dialogWindow.setWindowAnimations();设置动画效果
            setContentView(layoutResID);
    
    
            WindowManager windowManager = ((Activity)context).getWindowManager();
            Display display = windowManager.getDefaultDisplay();
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.width = display.getWidth()*4/5;// 设置dialog宽度为屏幕的4/5
            getWindow().setAttributes(lp);
            setCanceledOnTouchOutside(true);//点击外部Dialog消失
            //遍历控件id添加点击注册
            for(int id:listenedItem){
                findViewById(id).setOnClickListener(this);
            }
        }
        private OnCenterItemClickListener listener;
        public interface OnCenterItemClickListener {
            void OnCenterItemClick(MyDialog1 dialog, View view);
        }
        //很明显我们要在这里面写个接口,然后添加一个方法
        public void setOnCenterItemClickListener(OnCenterItemClickListener listener) {
            this.listener = listener;
        }
    
    
        @Override
        public void onClick(View v) {
            dismiss();//注意:我在这里加了这句话,表示只要按任何一个控件的id,弹窗都会消失,不管是确定还是取消。
            listener.OnCenterItemClick(this,v);
        }
    }
    

    3.主活动继承自己写的dialog的接口,实现点击方法

    //定义一个自己的dialog
     private MyDialog1 myDialog1;
    //实例化自定义的dialog
      myDialog1 = new MyDialog1(this,R.layout.dialog_2,new int[]{R.id.dialog_btn});
      //绑定点击事件
     myDialog1.setOnCenterItemClickListener((MyDialog1.OnCenterItemClickListener) this);
     //显示
      myDialog1.show();
     //调用点击函数
     @Override
        public void OnCenterItemClick(MyDialog1 dialog, View view) {
            switch (view.getId()){
                case R.id.dialog_btn:
                    Toast.makeText(getApplicationContext(),"点击了",Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
    
        }  
    

    总结

    最近项目还是没进度哇哇哇,心塞塞,准备开始弄个安卓游戏项目,要学一大堆东西。
    https://github.com/sakurakid/DialogDemo这个的git地址,希望对别人有帮助 
     

    展开全文
  • Android自定义Dialog对话框的几种方法(精简版)

    万次阅读 多人点赞 2019-03-11 16:09:16
    自定义对话框是经常使用的功能,我们常用的弹窗操作,除了使用popwindow就是使用dialog来实现,这两种组件都支持之定义布局和功能来满足我们个性化的需求,也可以不采用自定义而直接使用系统封装好的api来实现功能。...
  • Android中常见八种Dialog

    2020-07-30 19:05:47
    Eclipse平台实现Android中常见的八种对话框(Dialog),包括简单Dialog,列表Dialog,复选框Dialog,单选Dialog,进度条Dialog,日期dialog,时间Dialog,自定义Dialog。自定义Dialog实现的是包含用户账号和密码的...
  • Android自定义加载中Dialog

    万次阅读 2016-11-29 23:41:52
    开发中经常需要请求网络获取数据,我们在请求网络到得到数据时当中需要等待一些时间,为了增加用户体验,我们一般会用一个Dialog来提示用户我们在加载网络数据。今天我们来实现如下效果的加载中Dialog。 从图中...
  • opensource sweet-alert-dialog android studio
  • Android实现全屏的dialog

    千次阅读 2020-08-08 09:17:55
    Android实现全屏的dialog 最近在做项目的时候,需要用到一个全屏的dialog。话不多说直接开整。 首先准备dialog的物料: 布局就比较简单,就两个TextView。 &amp;lt;?xml version=&quot;1.0&quot; ...
  • android自定义Dialog

    千次阅读 2019-03-01 10:33:51
    android中为了用户体验常常会有很漂亮的dialog提示框,但是系统自带的dialog又解决不了产品的需求,这个时候就需要我们去自定义一个dialog去解决了,这里给大家准备了两个方法大家可以参考参考; 1.通过申明一个...
  • Android修改自定义Dialog为全屏

    万次阅读 2017-07-26 19:36:23
    我们在用Android原生的Dialog的时候,你会发现原生的Dialog不是全屏,而有的时候我们的需求是要求Dialog宽度为全屏,或者宽度和高度为全屏。这里我说以下怎么做首先创建一个类,继承Dialog重写里面的构造方法,我们...
  • 安卓自定义Dialog的实现

    万次阅读 多人点赞 2019-02-16 09:52:11
    安卓自定义Dialog
  • Android 官方推荐 : DialogFragment 创建对话框

    万次阅读 多人点赞 2016-08-10 19:35:00
    DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。 在DialogFragment产生之前,我们创建对话框:一般采用...
  • AndroidDialog的使用

    万次阅读 2016-05-12 12:50:06
    Android中经常要使用Dialog来实现一些提示以及一些特殊的效果,而且样式也不一样,每次都得查一大堆资料,还不一定能解决,这里总结一些常用的Dialog的实践。普通的Dialog//普通的AlertDialog对话框 findViewById...
  • android Dialog式主题

    2017-02-15 15:10:53
    android应用可以自定义主题。 【1】在res/value/style.xml下定义主题  @null  true  false  true  @null  false  @android:color/transparent除去背景色 -->  @drawabl
  • Android中的Dialog用法讲解大全

    千次阅读 2011-06-24 17:24:00
    Android中的几种对话框效果的应用。...这篇资料会让我们更了解Dialog的用法,下面我们就来看看代码吧:Java代码:android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_
  • Android Dialog

    万次阅读 2018-12-28 13:45:47
    第一步创建UpdateDialog.class package ... import android.app.Dialog; import android.content.Context; import android.view.Gravity; import android.view.View; import android.view.Wi...
  • Android——加载中的dialog

    千次阅读 2016-05-04 16:44:39
    1、自定义dialog  java: public class CustomProgressBar extends Dialog { private Context context ; private String progressText ; public CustomProgressBar(Context context) { sup
  • Android中自定义圆角的Dialog

    万次阅读 2016-06-17 07:14:26
    效果图: 核心代码: MainActivity中 public class MainActivity extends Activity { private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate
1 2 3 4 5 ... 20
收藏数 93,532
精华内容 37,412
关键字:

dialogandroid