DialogFragment初探路

来源:互联网 发布:功夫时时彩软件 编辑:程序博客网 时间:2024/06/14 05:22

三种实现弹窗框的方式

弹出框的三类使用:PopupWindow、dialog,DialogFragment。
使用DialogFragment的好处:

  1. 使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。
  2. 且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)
  3. Android 官方推荐使用 DialogFragment 来代替 Dialog ,可以让它具有更高的可复用性(降低耦合)和更好的便利性(很好的处理屏幕翻转的情况)
  4. 便于重用,封装使用

使用DialogFragment

使用DialogFragment至少需要实现onCreateView或者onCreateDIalog方法。

  • onCreateView即使用定义的xml布局文件展示Dialog,实现复杂的dialog布局
  • onCreateDialog即利用AlertDialog或者Dialog创建出Dialog,实现简单统一风格的布局。

1、在onCreateDialog中使用

    @NonNull    @Override    public Dialog onCreateDialog(Bundle savedInstanceState) {        AlertDialog.Builder _builder = new AlertDialog.Builder(getActivity());        _builder.setTitle("提示");        _builder.setMessage("是否退出应用?");        _builder.setPositiveButton("确定", null);        _builder.setNegativeButton("取消", null);        _builder.setCancelable(false);        return _builder.create();    }

2、在onCreateView中使用

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


可以看到顶部有一个标题
去掉标题:在onCreateView中添加,在 View _view = inflater.inflate(R.layout.dialog_fragment, container);前面
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);

3、传递数据给Activity

从dialog传递数据给Activity,可以使用“fragment interface pattern”的方式,下面通过一个改造上面的登录框来展示这种模式。
创建一个接口用于回调

public interface LoginInputListener {        void onLoginInputComplete(String _userName);    }

直接贴代码

    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);        View _view = inflater.inflate(R.layout.dialog_fragment, container);        unbinder = ButterKnife.bind(this, _view);        return _view;    }    @OnClick(R.id.id_sure_edit_name)    public void onViewClicked() {        String _userName = idTxtYourName.getText().toString();        //获取宿主Activity的对象        LoginInputListener _listener = (LoginInputListener) getActivity();        _listener.onLoginInputComplete(_userName);    }    @Override    public void onDestroyView() {        super.onDestroyView();        unbinder.unbind();    }    public interface LoginInputListener {        void onLoginInputComplete(String _userName);    }

4、实现全屏

实现全屏(宽/高度全屏)// 设置宽度为屏宽、位置靠近屏幕底部Window window = dialog.getWindow();window.setBackgroundDrawableResource(R.color.transparent);WindowManager.LayoutParams wlp = window.getAttributes();wlp.gravity = Gravity.BOTTOM;wlp.width = WindowManager.LayoutParams.MATCH_PARENT;wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;window.setAttributes(wlp);

5、可以根据不同的屏幕分,大屏弹出显示,小屏嵌入Activity

if (mIsLargeLayout) {      // The device is using a large layout, so show the fragment as a      // dialog      newFragment.show(fragmentManager, "dialog");    } else {      // The device is smaller, so show the fragment fullscreen      FragmentTransaction transaction = fragmentManager.beginTransaction();      // For a little polish, specify a transition animation      transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);      // To make it fullscreen, use the 'content' root view as the container      // for the fragment, which is always the root view for the activity      transaction.replace(R.id.id_ly, newFragment).commit();    }
原创粉丝点击