三种实现弹窗框的方式
弹出框的三类使用:PopupWindow、dialog,DialogFragment。
使用DialogFragment的好处:
- 使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。
- 且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)
- Android 官方推荐使用 DialogFragment 来代替 Dialog ,可以让它具有更高的可复用性(降低耦合)和更好的便利性(很好的处理屏幕翻转的情况)
- 便于重用,封装使用
使用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();
}
本文介绍了使用DialogFragment实现弹窗框的五种方法,包括在onCreateDialog中使用、在onCreateView中使用、传递数据给Activity、实现全屏及根据不同屏幕尺寸调整显示方式。
1626

被折叠的 条评论
为什么被折叠?



