Android DialogFragment的基本使用和总结

前言

最近在项目中大量使用dialog 在使用时和管理时总是不方便

后来全部换成了DialogFragment 统一封装 方便管理生命周期 方便调用方法

Android DialogFragment的基本使用和总结_第1张图片

DialogFragment 官方推荐使用

1、实现类继承自DialogFragment类
2、必须重写onCreateView或onCreateDialog方法,onCreateView可以自定义对话框,onCreateDialog使用默认对话框
3、DialogFragment包含Dialog.setOnCancelListener() 和Dialog.setOnDismissListener()回调,可在取消或清除对话框时自定义操作
4、利用bundle和setArguments()、getArguments()方法,实现Fragment或Activity与Dialogfragment间的参数传递

DialogFragment的创建方法

  • 第一种是是重新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("选项1", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {

                   }
               })
               .setNegativeButton("选项2", 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) {
        if (getDialog().getWindow() != null)
            getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        View inflate = inflater.inflate(R.layout.pay_result_dialog, container, false);
        mTvContent = inflate.findViewById(R.id.tv_content);
        mBtnBackHome = inflate.findViewById(R.id.btn_back_home);
        return inflate;
    }

按照android 官方的话来说 DialogFragment其实就是Fragment 你就把它当做一个Fragment用就可以 生命周期 方法回调等等

比如我要写一个点击事件的回调
操作方法如下

  @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        //返回主页
        mBtnBackHome.setOnClickListener(v -> {
            if (mListener != null) {
                mListener.onCatalogSelect(v);
            }
        });

    }

    //回调通知
    private OnBackClickListener mListener;

    public void setListener(OnBackClickListener listener) {
        mListener = listener;
    }

    public interface OnBackClickListener {
        void onCatalogSelect(View view);
    }

全屏设置

很多人在用dialog的时候,有时候需要dialog的左右全屏填充满
有如下的几种方式可以实现:
在5.0以上的版本中,我们在style中可以查看默认的dialog风格,
其实有设置dialog的一些属性,自己定义一种类型的dialog,
然后继承就可以修改整体dialog中的风格了,
默认动画,背景颜色,或者宽度之类的都是可以的
如下:

 

   
//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中设置一下就行,这样就可以定义自己想要实现的效果

 

android 官方推荐使用DialogFragment 其原因就是方便管理 其实就是一个Fragment
并没有那么复杂 用起来很好用 你也来一起试试吧~!

你可能感兴趣的:(Android技术升级与探知,android,dialog,DialogFragment,移动开发)