Android收藏集

解锁Android Dialog的各种使用姿势

2018-05-12  本文已影响387人  sweetying

前言

在Android开发中,Dialog被使用的非常频繁,因此这里总结了一下Dialog的几种使用方式

方式一 Android自带Dialog---AlertDialog

  1. item_mydialog.xml布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="@drawable/shape_mydialog"
    android:orientation="vertical"
    android:padding="10dp"
    android:layout_height="wrap_content">
    
    
    <TextView
     android:id="@+id/tv_title"
     android:text="标题"
     tools:text="标题"
     android:layout_marginStart="10dp"
     android:textColor="@android:color/holo_green_light"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
    <TextView
     android:id="@+id/tv_msg"
     android:text="这是提示的内容"
     android:layout_marginStart="10dp"
     android:layout_marginTop="10dp"
     tools:text="这是提示的内容"
     android:textColor="@android:color/black"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
    <LinearLayout
     android:layout_marginTop="10dp"
     android:layout_gravity="end"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:orientation="horizontal">
    <TextView
     android:id="@+id/tv_confirm"
     android:text="确定"
     android:layout_marginEnd="10dp"
     tools:text="确定"
     android:textColor="@android:color/holo_green_light"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
    <TextView
     android:id="@+id/tv_cancel"
     android:text="取消"
     android:layout_marginEnd="10dp"
     tools:text="取消"
     android:textColor="@android:color/holo_green_light"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    </LinearLayout>
    
    </LinearLayout>
    

2.在适当的地方进行如下调用

new AlertDialog.Builder(this)
            .setView(R.layout.item_mydialog)//此处也可以传入一个View,根据构造方法来,传入View可以对View的子控件进行相关操作
            .show();

效果图:


效果图

方式二 继承Dialog类,自定义Dialog

  1. Xml布局使用的是方式一中的

  2. MyDialog代码如下

    public class MyDialog extends Dialog{
    
    private TextView tvTitle,tvMsg,tvConfirm,tvCancel;
    
    private OnMyDialogClickListener onMyDialogClickListener;
    
    public MyDialog setOnMyDialogClickListener(OnMyDialogClickListener onMyDialogClickListener) {
     this.onMyDialogClickListener = onMyDialogClickListener;
     return this;
    }
    
    public MyDialog(@NonNull Context context) {
     super(context, R.style.MyDialogStyle);
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.item_mydialog);
    
     initView();
    
    }
     /**
      * 初始化
      */
    private void initView() {
      tvTitle = findViewById(R.id.tv_title);
      tvMsg = findViewById(R.id.tv_msg);
      tvConfirm = findViewById(R.id.tv_confirm);
      tvCancel = findViewById(R.id.tv_cancel);
      tvConfirm.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             dismiss();
             if(onMyDialogClickListener != null){
                 onMyDialogClickListener.onConfirmClick(MyDialog.this);
             }
         }
     });
    
     tvCancel.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             dismiss();
             if(onMyDialogClickListener != null){
                 onMyDialogClickListener.onCancelClick(MyDialog.this);
             }
         }
     });
    
    
     setCanceledOnTouchOutside(true);
     setCancelable(true);
     }
    
    
    
    public MyDialog setTitle(String title){
     tvTitle.setText(title);
     return this;
    }
    
    public MyDialog setMsg(String msg){
     tvMsg.setText(msg);
     return this;
     }
    
    
    
    @Override
    protected void onStart() {
     super.onStart();
     //设置Dialog显示大小位置动画等操作
     Window window = getWindow();
     Display display = window.getWindowManager().getDefaultDisplay();
     window.setLayout((int) (display.getWidth()*0.9),WindowManager.LayoutParams.WRAP_CONTENT);
    }
    
    public interface OnMyDialogClickListener{
     void onConfirmClick(Dialog dialog);
    
     void onCancelClick(Dialog dialog);
    }
    }
    
  3. MyDialogStyle样式

    <style name="MyDialogStyle" parent="@android:style/Theme.Dialog">
     <item name="android:windowNoTitle">true</item>
     <item name="android:windowIsFloating">true</item> <!--这个说明提示框是否是浮动的-->
     <item name="android:windowIsTranslucent">true</item> <!--这个说明提示框是否是透明的-->
     <item name="android:windowBackground">@android:color/transparent</item><!--这个说明提示框的背景颜色是什么-->
     <item name="android:backgroundDimEnabled">true</item><!--这个说明是否充许对话框的背景变暗。为true则充许变暗-->
    </style>
    

4.在适当的位置进行如下调用即可

MyDialog myDialog = new MyDialog(this);
 if(myDialog.isShowing()){
      myDialog.dismiss();
  }else {
      myDialog.show();
  }

效果图:


效果图

注意

以上两种方式创建的Dialog,官方并不推荐使用,因为没有生命周期管理,所以我们必须在使用完,或退出界面时手动对Dialog进行销毁

方式三 继承DialogFragment创建对话框

概述

好处与用法

使用方式

  1. 重写onCreateView创建Dialog

效果图:


效果图
  1. 重写onCreateDialog创建Dialog

效果图:


效果图

使用心得

如果对我的文章感兴趣的话,请为我点赞,谢谢!!!

上一篇 下一篇

猜你喜欢

热点阅读