美文网首页Android收藏集
解锁Android Dialog的各种使用姿势

解锁Android Dialog的各种使用姿势

作者: sweetying | 来源:发表于2018-05-12 00:30 被阅读387次

    前言

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

    方式一 Android自带Dialog---AlertDialog

    • AlertDialog底层采用了构造者模式,通过构造者在创建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创建对话框

    概述

    • 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(),"");
      

    效果图:


    效果图
    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(),"");
      

    效果图:


    效果图

    使用心得

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

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

    相关文章

      网友评论

      本文标题:解锁Android Dialog的各种使用姿势

      本文链接:https://www.haomeiwen.com/subject/zlaqdftx.html