根据已上线的app里总结出来的实用小技巧
一、简介
Android中的对话框到目前为止一共有四种, Dialog、FragmentDialog、AlertDialog、AlertDialog(v7包里的)
本人用的比较多的是AlertDialog(V7)
和FragmentDialog
, 也推荐大家使用这两种对话框
-
Dialog、FragmentDialog
简介-
DialogFragment
在android 3.0
时被引入 - 在
DialogFragment
产生之前,我们创建对话框使用的是:AlertDialog
和Dialog
- Google公司早已推荐大家使用
FragmentDialog
来代替Dialog
使用了 -
FragmentDialog
相对于Dialog
只是用法不一样了, 其他显示的都还是一样 -
FragmentDialog
使得我们更方便来管理这个对话框
-
-
AlertDialog、AlertDialog(v7)
- 在
Android5.0
的Daterial Design
风格出来后也相继的出了一个跟AlertDialog
相同名字的对话框API, 跟以前的相比做了很多的优化, 下面是对比图 - 前者为原始的
AlertDialog
, 后者为v7
包里的AlertDialog
- 在
AlertDialog(V7)
的使用方法就不介绍了, 几乎和普通的AlertDialog
用法一毛一样
二、DialogFragment使用
和普通的Fragment
一样使用, 继承DialogFragment
(是导入v4包里的)
DialogFragment
内部也是继承的Fragment
废话不多说, 先看效果图
当然这个样式也因为加了一些别的设置和style
可以根据自己的需求来设置
styles.xml
<style name="dialog" parent="android:style/Theme.Dialog">
<!-- 透明背景 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 无边框 -->
<item name="android:windowFrame">@null</item>
<!-- 是否没有标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 是否浮现在activity之上 -->
<item name="android:windowIsFloating">true</item>
<!-- 是否半透明 -->
<item name="android:windowIsTranslucent">true</item>
</style>
<!-- 对话框开启和关闭的动画 -->
<style name="style_item" parent="android:Animation">
<!-- 从屏幕底部弹出 -->
<item name="@android:windowEnterAnimation">@anim/dialog_enter</item>
<!-- 从弹出的位置收回 -->
<item name="@android:windowExitAnimation">@anim/dialog_exit</item>
</style>
dialog_enter.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromYDelta="100%p" />
</set>
dialog_exit.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:toYDelta="100%p" />
</set>
BaseDialogFragment.class
/**
* DialogFragment的基类
*/
public class BaseDialogFragment extends DialogFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.dialog);//设置无标题、透明背景、无边框等等属性
setCancelable(true);//设置点击除了对话框以外的部分就关闭
}
@Override
public void onStart() {
super.onStart();
//设置宽度满屏
DisplayMetrics dm = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
getDialog().getWindow().setLayout(dm.widthPixels, getDialog().getWindow().getAttributes().height);
//设置显示和关闭时的动画
getDialog().getWindow().setWindowAnimations(R.style.style_item);
}
}
GoodsDialogFragment.class
/**
* 商品规格的对话框
*/
public class GoodsDialogFragment extends BaseDialogFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//对话框底部对齐, 这句话不能写onCreate里(包括父类的),在onCreate里执行getDialog()获取的值为null
getDialog().getWindow().setGravity(Gravity.BOTTOM);
return getActivity().getLayoutInflater().inflate(R.layout.dialog_goods, container);
}
}
二、AlertDialog(v7)
下面用一个非常常用的类似加载中的对话框来演示AlertDialog(v7)
的用法
先看效果图
DialogUtils.class
/**
* 对话框工具类
* Created by me on 2016/3/11.
*/
public class DialogUtils {
private static AlertDialog.Builder loadingBuilder;
private static AlertDialog loadingDialog;
/**
* 显示正在加载的对话框
*
* @param activity
*/
public static void showLoadingDialog(final Activity activity) {
if (!activity.isFinishing()) {
loadingBuilder = new AlertDialog.Builder(activity, R.style.dialog);
loadingBuilder.setView(R.layout.dialog_logining);
loadingBuilder.setCancelable(true);//点击非对话框关闭
loadingDialog = loadingBuilder.create();
loadingDialog.show();
}
}
/**
* 关闭正在加载的对话框
*/
public static void hideLoadingDialog() {
if (loadingDialog != null && loadingDialog.isShowing()) {
loadingDialog.dismiss();
}
}
dialog_logining.xml
圆形进度条用的github上的开源控件MaterialProgressBar
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<!-- 圆角背景-->
<LinearLayout
android:layout_width="300dp"
android:layout_height="70dp"
android:background="@drawable/shape_white_corners"
android:gravity="center_vertical">
<!-- 圆形进度条-->
<me.zhanghai.android.materialprogressbar.MaterialProgressBar
style="@style/Widget.MaterialProgressBar.ProgressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:indeterminate="true"
app:mpb_progressTint="?attr/colorPrimary"
app:mpb_progressStyle="circular" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="验证中..."
android:textColor="#222222"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
shape_white_corners.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#ffffff" />
<corners android:bottomLeftRadius="6dp" android:bottomRightRadius="6dp" android:radius="6dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" />
</shape>
</item>
</selector>
- 代码也不多, Demo就不传上来了
- 用法都是比较简单的, 只是提供大家可以参考
网友评论