DialogFragment初探路

本文介绍了使用DialogFragment实现弹窗框的五种方法,包括在onCreateDialog中使用、在onCreateView中使用、传递数据给Activity、实现全屏及根据不同屏幕尺寸调整显示方式。

三种实现弹窗框的方式

弹出框的三类使用: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();  
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值