dialogFragment使用

作者: zhengLH | 来源:发表于2019-10-14 10:44 被阅读0次

    【背景】dialogFragment 的大小,位置,样式, 动画效果???
    【传送门】https://www.jianshu.com/p/d1852b04a0aa
    【知识】

    1、 概述
    

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

    2、 好处与用法
    

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

    【1 自定义dialog】
    (法1) 重写onCreateDialog()方法
    (法2)重写onViewCreated()方法

    /**
     * 时间: 2019/10/12 16:54
    * 作者: Lee
    * 描述:  对话框
    */
    public class MyDialogFragment extends DialogFragment {
    
    private CallbackListener mCallbackListener;
    private String mTitle;
    private String mContent;
    
     // 调用并传递参数
    public static MyDialogFragment newInstance(String param1, String param2) {
        MyDialogFragment fragment = new MyDialogFragment();
        Bundle bundle = new Bundle();
        bundle.putString("param1", param1);
        bundle.putString("param2", param2);
        fragment.setArguments(bundle);
        return fragment;
    }
    
    
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
       / 获取参数
        Bundle bundle = getArguments();
        String param1 = bundle.getString("param1");
        String param2 = bundle.getString("param2");
    
        // 修改diglog外观样式:
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Mydialog);
    
        // 在onCreate或者onCreateView都可以
        /*getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.RED));
        getDialog().getWindow().setDimAmount(0.5f);//背景黑暗度
        //点击window外的区域 是否消失
        getDialog().setCanceledOnTouchOutside(canCanceledOnOutside());
        */
    }
    
    
    @Override
    public void onStart() {
        super.onStart();
        /*Dialog dialog = getDialog();
        if (dialog != null) {
            Window window = dialog.getWindow();
            if (window != null) {
                int width = ViewGroup.LayoutParams.MATCH_PARENT;
                int height = ViewGroup.LayoutParams.MATCH_PARENT;
                // 1 设置全屏
                // window.setLayout(width, height);
                // 2. 设置指定大小
                // window.setLayout(750, 600);
                // 3. 设置占用屏幕宽度一定比例
                DisplayMetrics dm = new DisplayMetrics();
                getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
                dialog.getWindow().setLayout((int) (dm.widthPixels * 0.75), ViewGroup.LayoutParams.WRAP_CONTENT);
    
            }
        }*/
    
        // 设置dialog大小和位置
        Window win = getDialog().getWindow();
        WindowManager.LayoutParams params = win.getAttributes();
        params.gravity = Gravity.BOTTOM; // 位置
        //  params.y = DisplayUtils.dip2px(getContext(), 100);// 具体头部距离
        params.width = (ViewGroup.LayoutParams.MATCH_PARENT); // 大小
        params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
        win.setAttributes(params);
    
    }
    
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        return super.onCreateDialog(savedInstanceState);
       /* AlertDialog dialog = new AlertDialog.Builder(getActivity())
                .setTitle("神灯")
                .setMessage("来选择你要实现的一个愿望把")
                .setPositiveButton("车子", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getActivity(), "车子", Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                    }
                })
                .setNegativeButton("房子", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getActivity(), "房子", Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                    }
                }).create();
        return dialog;*/
    }
    
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 自定义布局:
        //1.必须设置dialog的window背景为透明颜色,不然圆角无效或者是系统默认的颜色
        // getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        View view = inflater.from(getActivity()).inflate(R.layout.fragment_dialog, container, false);
        return view;
    }
    
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        TextView mTvTitle = view.findViewById(R.id.tv_title);
        TextView mTvContent = view.findViewById(R.id.tv_content);
    
        mTvTitle.setText(mTitle);
        mTvContent.setText(mContent);
    
        view.findViewById(R.id.btn_sure).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mCallbackListener != null) {
                    mCallbackListener.onSure();
                }
            }
        });
        view.findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mCallbackListener != null) {
                    mCallbackListener.onCancel();
                }
            }
           });
       }
    
    public void setCallbackListener(String title, String content, CallbackListener callbackListener) {
        this.mTitle = title;
        this.mContent = content;
        this.mCallbackListener = callbackListener;
    }
    
    public interface CallbackListener {
        void onSure();
    
        void onCancel();
          }
     }
    

    【2】使用
    【注意 】使用Bundle传递参数持久化,屏幕旋转时候数据不会丢失,但是通过接口传递过来会丢失。

    package com.example.testperoject.act;
    
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Toast;
    import com.example.testperoject.R;
    import com.example.testperoject.fragment.dialog.MyDialogFragment;
    
    /**
    * 时间: 2019/10/12 16:48
    * 作者: Lee
    * 描述:
    */
    public class DialogActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
        initView();
    }
    
    private void initView() {
        findViewById(R.id.btn_dialog).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              // final MyDialogFragment myDialogFragment = new MyDialogFragment();
                // 使用方法: 第二参数: 别名
                final MyDialogFragment myDialogFragment = MyDialogFragment.newInstance("哈哈", "嗷嗷");
                myDialogFragment.show(getSupportFragmentManager(), "lee");
                myDialogFragment.setCallbackListener("lee", "鉴定完毕,是帅哥!", new MyDialogFragment.CallbackListener() {
                    @Override
                    public void onSure() {
                        myDialogFragment.getDialog().dismiss();
                        Toast.makeText(DialogActivity.this, "确定", Toast.LENGTH_SHORT).show();
                    }
    
                    @Override
                    public void onCancel() {
                        myDialogFragment.getDialog().dismiss();
                        Toast.makeText(DialogActivity.this, "取消", Toast.LENGTH_SHORT).show();
    
                    }
                });
            }
          });
         }
     }
    

    【xml 布局】

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">
    
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="标题222"
        android:textSize="22sp"
        android:textStyle="bold" />
    
    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:gravity="center"
        android:text="内容内容内容内容内容内容内容内容"
        android:textSize="16sp" />
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    
        <Button
            android:id="@+id/btn_sure"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="确定" />
    
        <Button
            android:id="@+id/btn_cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="取消" />
    
         </LinearLayout>
    
    </LinearLayout>
    

    【style 样式】

     <resources>
    
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    
    <!-- 自定义dialog样式-->
    <style name="Mydialog" parent="android:Theme.Holo.Light.Dialog">
        <!--背景-->
        <item name="android:windowBackground">@drawable/shape_rect_conner</item>
        <item name="android:windowFrame">@null</item>
        <!--背景是否变暗-->
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <!--动画方式-->
        <item name="android:windowAnimationStyle">@style/DialogAnimation</item>
    </style>
    
    <!--自定义dialog动画样式-->
    <style name="DialogAnimation">
        <item name="android:windowEnterAnimation">@anim/bottom_dialog_enter_anim</item>
        <item name="android:windowExitAnimation">@anim/bottom_dialog_exit_anim</item>
    </style>
    
    </resources>
    

    【工具类】

     package com.example.testperoject.util;
    
     import android.content.Context;
    
      /**
      * 作者:      lee
      * 日期:      2017/3/16
     * 版本:      V1.0
     * 描述:      dp、sp 转换为 px 的工具类
     */
    
     public class DisplayUtils {
    
    /**
     * 将px值转换为dip或dp值,保证尺寸大小不变
     *
     * @param context
     * @param pxValue
     * @return
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }
    
    /**
     * 将dip或dp值转换为px值,保证尺寸大小不变
     *
     * @param context
     * @param dipValue
     * @return
     */
    public static int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }
    
    /**
     * 将px值转换为sp值,保证文字大小不变
     *
     * @param context
     * @param pxValue
     * @return
     */
    public static int px2sp(Context context, float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }
    
    /**
     * 将sp值转换为px值,保证文字大小不变
     *
     * @param context
     * @param spValue
     * @return
     */
    public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
         }
     }
    

    相关文章

      网友评论

        本文标题:dialogFragment使用

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