前言
在Android开发中,Dialog被使用的非常频繁,因此这里总结了一下Dialog的几种使用方式
方式一 Android自带Dialog---AlertDialog
- AlertDialog底层采用了构造者模式,通过构造者在创建AlertDialog对象,全程采用链式调用的方法,非常的方便
-
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
Xml布局使用的是方式一中的
-
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); } }
-
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。
使用方式
- 重写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(),"");
效果图:
- 重写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,易于管理