美文网首页安卓实用知识Android在开发中的实用技巧Android实践
Android在开发中的实用技巧之DialogFragment和

Android在开发中的实用技巧之DialogFragment和

作者: coexist | 来源:发表于2016-11-02 15:35 被阅读924次
    根据已上线的app里总结出来的实用小技巧

    一、简介

    Android中的对话框到目前为止一共有四种, Dialog、FragmentDialog、AlertDialog、AlertDialog(v7包里的)

    本人用的比较多的是AlertDialog(V7)FragmentDialog, 也推荐大家使用这两种对话框

    • Dialog、FragmentDialog简介
      • DialogFragmentandroid 3.0时被引入
      • DialogFragment产生之前,我们创建对话框使用的是: AlertDialogDialog
      • Google公司早已推荐大家使用FragmentDialog来代替Dialog使用了
      • FragmentDialog相对于Dialog只是用法不一样了, 其他显示的都还是一样
      • FragmentDialog使得我们更方便来管理这个对话框
    • AlertDialog、AlertDialog(v7)
      • Android5.0Daterial Design风格出来后也相继的出了一个跟AlertDialog相同名字的对话框API, 跟以前的相比做了很多的优化, 下面是对比图
      • 前者为原始的AlertDialog, 后者为v7包里的AlertDialog
    对比图
    AlertDialog(V7)的使用方法就不介绍了, 几乎和普通的AlertDialog用法一毛一样

    二、DialogFragment使用

    和普通的Fragment一样使用, 继承DialogFragment(是导入v4包里的)
    DialogFragment内部也是继承的Fragment
    废话不多说, 先看效果图

    FragmentDialog使用效果图

    当然这个样式也因为加了一些别的设置和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)的用法
    先看效果图

    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就不传上来了
    • 用法都是比较简单的, 只是提供大家可以参考

    相关文章

      网友评论

      本文标题:Android在开发中的实用技巧之DialogFragment和

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