解锁Android Dialog的各种使用姿势

前言

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

方式一 Android自带Dialog---AlertDialog

  • AlertDialog底层采用了构造者模式,通过构造者在创建AlertDialog对象,全程采用链式调用的方法,非常的方便
  1. item_mydialog.xml布局文件:

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

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

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

效果图:


解锁Android Dialog的各种使用姿势_第1张图片
效果图

方式二 继承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样式

    
    

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

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

效果图:


解锁Android Dialog的各种使用姿势_第2张图片
效果图

注意

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

方式三 继承DialogFragment创建对话框

概述

  • DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。
  • 在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框。

好处与用法

  • 使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的生命周期。且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)
  • 使用DialogFragment至少需要实现onCreateView或者onCreateDIalog方法。onCreateView即使用定义的xml布局文件展示Dialog。onCreateDialog即利用AlertDialog或者Dialog创建出Dialog。

使用方式

  1. 重写onCreateView创建Dialog
  • Xml布局使用方式一的

  • 继承DialogFragment,重写onCreateView()方法

    public class MyCommonFragmentDialog extends DialogFragment{
    
    private View mView;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
      mView = inflater.inflate(R.layout.item_mydialog,container,false);
      return mView;
    }
    
    
    @Override
    public void onStart() {
      super.onStart();
      Window window = getDialog().getWindow();
      if(window != null){
          Display defaultDisplay = window.getWindowManager().getDefaultDisplay();
          window.setLayout((int) (defaultDisplay.getWidth()*0.9), WindowManager.LayoutParams.WRAP_CONTENT);
      }
    
    }
    }
    
  • 在合适的位置进行如下调用

    MyCommonFragmentDialog myCommonFragmentDialog = new MyCommonFragmentDialog();
    myCommonFragmentDialog.show(getSupportFragmentManager(),"");
    

效果图:


解锁Android Dialog的各种使用姿势_第3张图片
效果图
  1. 重写onCreateDialog创建Dialog
  • Xml布局使用方式一的

  • 继承DialogFragment,重写onCreateDialog()方法

    public class MyFragmentDialog extends DialogFragment {
    
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
      AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
              .setView(R.layout.item_mydialog)
              .create();
      return alertDialog;
    }
    }
    
  • 在合适的位置进行如下调用

    MyFragmentDialog myFragmentDialog = new MyFragmentDialog();
    myFragmentDialog.show(getSupportFragmentManager(),"");
    

效果图:


解锁Android Dialog的各种使用姿势_第4张图片
效果图

使用心得

  • 如果Dialog界面比较简单,通常会选择前两种方式来创建Dialog,但是要注意在合适的地方对Dialog进行销毁
  • 如果Dialog界面比较复杂,而且涉及很多与Activity传值等问题,建议使用继承DialogFragment并重写onCreateView()方法的方式来创建Dialog,这样子我们就可以像使用普通Fragment的方式来使用Dialog,易于管理

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

你可能感兴趣的:(解锁Android Dialog的各种使用姿势)