点击屏幕外部无法关闭Dialog Fragment及getDialog()调用报错求助
错误原因说明
- 方法调用时机错误:
getDialog()是实例方法,不可直接用DialogFragment类名调用(会触发静态上下文报错),且你刚实例化TestFragment时,Dialog 还未完成初始化,此时调用getDialog()会返回空值,设置无效。 - 显示方式错误:你通过
FragmentTransaction.replace()将TestFragment嵌入到布局容器中,此时它的表现和普通Fragment一致,并非浮动在上层的Dialog,本身没有点击外部关闭的交互逻辑。
解决方案
方案一:使用DialogFragment标准浮动显示方式(推荐)
修改AFragment显示逻辑
替换原有事务添加逻辑,直接调用show()方法显示DialogFragment:
testfragment testfragments = new testfragment(); testfragments.show(getChildFragmentManager(), "filterPriceFragment");
修改TestFragment代码,添加关闭配置
在Dialog初始化完成的生命周期节点设置点击外部关闭:
public class testfragment extends DialogFragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { final Context contextThemeWrapper = new ContextThemeWrapper(getContext(), R.style.MyApplyButton); LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); return localInflater.inflate(R.layout.filter_price_fragment_lyt, container, false); } @Override public void onStart() { super.onStart(); Dialog dialog = getDialog(); if (dialog != null) { // 设置点击外部关闭 dialog.setCanceledOnTouchOutside(true); // 如需自定义Dialog宽高可添加下方配置 Window window = dialog.getWindow(); if (window != null) { WindowManager.LayoutParams params = window.getAttributes(); params.width = ViewGroup.LayoutParams.WRAP_CONTENT; params.height = ViewGroup.LayoutParams.WRAP_CONTENT; window.setAttributes(params); } } } }
方案二:必须嵌入指定布局容器时的实现方式
如果业务要求必须将TestFragment放入R.id.filter_pop_up_frame_lyt容器中,需自行实现点击外部关闭逻辑:
- 给TestFragment根布局设置点击事件拦截,避免点击Fragment自身区域触发关闭
- 在AFragment根布局监听点击事件,判断点击位置不在TestFragment显示区域时,调用
getChildFragmentManager().popBackStack()关闭TestFragment
内容的提问来源于stack exchange,提问作者sooraj
相关产品推荐
相关产品推荐

