您当前的位置: 首页 >  android

Kevin-Dev

暂无认证

  • 2浏览

    0关注

    544博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android -- Window】DialogFragment 的基本使用

Kevin-Dev 发布时间:2017-09-05 16:58:36 ,浏览量:2

一、简介

本文我们一起来学习 DialogFragment 的用法。

二、DialogFragment 的基本使用 1. 简单使用

方法一:重写 onCreateDialog 方法, 返回一个创建的dialog对象就行,具体如下:

public class MyDialogFragment extends DialogFragment{

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
       AlertDialog dialog =  new AlertDialog.Builder(getActivity())
               .setTitle("神灯")
               .setMessage("来选择你要实现的一个愿望把")
               .setPositiveButton("车子", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {

                   }
               })
               .setNegativeButton("房子", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {

                   }
               }).create();
        return dialog;

    }

    public class MainActivity extends AppCompatActivity {
    MyDialogFragment dialogFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dialogFragment = new MyDialogFragment();
        dialogFragment.show(getSupportFragmentManager(),"dialog");
    }
}

方法二:通过 onCreateView 来返回一个自己写好的 view 来完成,默认会在居中显示

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_my_test,null);
        return view;
    }

采用接口回调传递数据

 AlertDialog.Builder builder =  new AlertDialog.Builder(getContext())
                .setTitle("选择头像")
                .setPositiveButton("相册", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if(callback!=null){
                            callback.onPhoto();
                        }
                    }
                })
                .setNegativeButton("相机", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if(callback!=null){
                            callback.onCamera();
                        }
                    }
                });
        return builder.create();

    private Callback callback;


    public  interface Callback{
        void onPhoto();
        void onCamera();
    }


    public void setCallback(Callback callback) {
        this.callback = callback;
    }
//使用的地方
SelectPhotoFragment selectPhotoFragment = new SelectPhotoFragment();
        selectPhotoFragment.show(getSupportFragmentManager(), "photo");
        selectPhotoFragment.setCallback(new SelectPhotoFragment.Callback() {
            @Override
            public void onPhoto() {
                openCreame();
            }

            @Override
            public void onCamera() {

            }
        });
2. 全屏显示 dialog

在5.0以上的版本中,我们在style中可以查看默认的dialog风格,其实有设置dialog的一些属性,自己定义一种类型的dialog,然后继承就可以修改整体dialog中的风格了,默认动画,背景颜色,或者宽度之类的都是可以的如下:

 
        100%
        100%
        @android:color/transparent
    

   
   
        @style/MyMinDialogWidth
        @style/MyMinDialogWidth
    
//Theme.AppCompat.Dialog主题常用的一般有以下属性:

  

@android:color/transparent  

  

@null  

  

true  

  

true  

  

true  

 

@android:color/transparent  

  

true  

  

0.5 

这样我们就可以自由的操作布局控件,设置大小了。或者继承一个dialog在代码中设置

//给dialog设置弹出动画
getWindow().setWindowAnimations(R.style.dialog_animtion_style);
//设置dialog的大小
  WindowManager.LayoutParams lp=getWindow().getAttributes();
        lp.width=WindowManager.LayoutParams.MATCH_PARENT;
        lp.height=WindowManager.LayoutParams.WRAP_CONTENT;
        /*lp.gravity= Gravity.BOTTOM;*/
        getWindow().setAttributes(lp);

其实由于 dialog 的默认效果是在中间显示,有时候我们需要让他显示在顶部或者底部,上面代码注释掉的地方可以修改 gravity 来达到效果。

有时候需要设置 dialog 的弹出和退出时候的动画,其实也是在 style 中设置一下就行,这样就可以定义自己想要实现的效果

 
        @anim/dialog_show_anim
        @anim/dialog_miss_anim
    
三、第三方开源库 NiceDialog 简介

DialogFragment 是 Android3.0 引入的,也是官方推荐来创建对话框的,兼具 dialog 以及 Fragment 的特性。接下来在 DialogFragment 的基础上实现我们的 NiceDialog,我们实现的 dialog 要能够简单的使用,也要易扩展,同时支持 BottomDialog,让 dialog 的使用更方便。

效果图

在这里插入图片描述

在这里插入图片描述

基本用法

1. 添加 JitPack 仓库 在当前项目等根目录下的 build.gradle 文件中添加如下内容:

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

2. 添加项目依赖

dependencies {
        compile 'com.github.Othershe:NiceDialog:1.1.1'
}

3. 配置、展示 dialog

NiceDialog.init()
          .setLayoutId(R.layout.dialog)     //设置 dialog 布局文件
          .setConvertListener(new ViewConvertListener() {     //进行相关 View 操作的回调
              @Override
              public void convertView(ViewHolder holder, final BaseNiceDialog dialog) {
	//如果需要找布局中相应的控件;
	Button mBtnCancel =(Button)holder.getConvertView().findViewById(R.id.cancel);

//如果只需要控件的点击事件
viewHolder.setOnClickListener(R.id.cancel, new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                dialog.dismiss();
                            }
                        });
              }
          })
          .setDimAmount(0.3f)     //调节灰色背景透明度[0-1],默认 0.5f
          .setShowBottom(true)     //是否在底部显示 dialog,默认flase
          .setMargin()     //dialog 左右两边到屏幕边缘的距离(单位:dp),默认0dp
          .setWidth()     //dialog 宽度(单位:dp),默认为屏幕宽度
          .setHeight()     //dialog 高度(单位:dp),默认为WRAP_CONTENT
          .setOutCancel(false)     //点击 dialog 外是否可取消,默认true
          .setAnimStyle(R.style.EnterExitAnimation)     //设置dialog进入、退出的动画style(底部显示的 dialog 有默认动画)
          .show(getSupportFragmentManager());     //显示dialog

注意: setMargin()和setWidth()选择一个即可

4. 逻辑代码

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void share(View view) {
        NiceDialog.init()
                .setLayoutId(R.layout.share_layout)   //设置dialog布局文件
                .setConvertListener(new ViewConvertListener() {
                    @Override
                    public void convertView(ViewHolder viewHolder, BaseNiceDialog baseNiceDialog) {
                    //dialog 中 view 的点击事件
                        viewHolder.setOnClickListener(R.id.wechat, new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                Toast.makeText(MainActivity.this,"进入微信中...",Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                })
                .setDimAmount(0.3f)
                .setShowBottom(true)
                .setOutCancel(true)
                .setAnimStyle(R.style.EnterExitAnimation)
                .show(getSupportFragmentManager());
    }


    public void setFriend(View view) {
        NiceDialog.init()
                .setLayoutId(R.layout.friend_set_layout)
                .setConvertListener(new ViewConvertListener() {
                    @Override
                    public void convertView(ViewHolder holder, final BaseNiceDialog dialog) {

                    }
                })
                .setShowBottom(true)
                .setHeight(310)
                .show(getSupportFragmentManager());
    }

    public void commit(View view) {
        NiceDialog.init()
                .setLayoutId(R.layout.commit_layout)
                .setConvertListener(new ViewConvertListener() {
                    @Override
                    public void convertView(ViewHolder holder, final BaseNiceDialog dialog) {
                        final EditText editText = holder.getView(R.id.edit_input);
                        editText.post(new Runnable() {
                            @Override
                            public void run() {
                                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                                imm.showSoftInput(editText, 0);
                            }
                        });
                    }
                })
                .setShowBottom(true)
                .show(getSupportFragmentManager());
    }

    public void openRed(View view) {
        NiceDialog.init()
                .setLayoutId(R.layout.ad_layout)
                .setConvertListener(new ViewConvertListener() {
                    @Override
                    public void convertView(ViewHolder holder, final BaseNiceDialog dialog) {
                        holder.setOnClickListener(R.id.close, new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                dialog.dismiss();
                            }
                        });
                    }
                })
                .setWidth(210)
                .setOutCancel(false)
                .setAnimStyle(R.style.EnterExitAnimation)
                .show(getSupportFragmentManager());
    }


    public void load(View view) {
        NiceDialog.init()
                .setLayoutId(R.layout.loading_layout)
                .setWidth(100)
                .setHeight(100)
                .setDimAmount(0)
                .show(getSupportFragmentManager());
    }

    public void sure(View view) {
        ConfirmDialog.newInstance("1")
                .setMargin(60)
                .setOutCancel(false)
                .show(getSupportFragmentManager());
    }

    public void sure02(View view) {
        ConfirmDialog.newInstance("2")
                .setMargin(60)
                .setOutCancel(false)
                .show(getSupportFragmentManager());
    }

    public static class ConfirmDialog extends BaseNiceDialog {
        private String type;

        public static ConfirmDialog newInstance(String type) {
            Bundle bundle = new Bundle();
            bundle.putString("type", type);
            ConfirmDialog dialog = new ConfirmDialog();
            dialog.setArguments(bundle);
            return dialog;
        }

        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Bundle bundle = getArguments();
            if (bundle == null) {
                return;
            }
            type = bundle.getString("type");
        }

        @Override
        public int intLayoutId() {
            return R.layout.confirm_layout;
        }

        @Override
        public void convertView(ViewHolder holder, final BaseNiceDialog dialog) {
            if ("1".equals(type)) {
                holder.setText(R.id.title, "提示");
                holder.setText(R.id.message, "您已支付成功!");
            } else if ("2".equals(type)) {
                holder.setText(R.id.title, "警告");
                holder.setText(R.id.message, "您的账号已被冻结!");
            }
            holder.setOnClickListener(R.id.cancel, new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });

            holder.setOnClickListener(R.id.ok, new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
        }
    }
}

关注
打赏
1658837700
查看更多评论
立即登录/注册

微信扫码登录

0.0384s