SettingsFragment中调用requireActivity()空指针异常风险排查
问题排查结论
你收到的警告是合理的,requireActivity()确实存在触发NullPointerException的潜在风险,现有代码在常规交互下不会报错,但极端场景下会出现崩溃。
风险原因
requireActivity()的底层实现逻辑是:当Fragment未附着到宿主Activity时,会直接抛出空指针异常。你将该调用放在了OnBindEditTextListener的异步回调中,回调执行时机和Fragment生命周期没有绑定,如果回调触发时用户已经关闭了Settings页面、Fragment已经执行完onDetach()和宿主Activity解绑,就会触发崩溃。
现有代码的安全场景
你当前的实现中,SettingsActivity创建时就直接加载了SettingsFragment,且在onAttachFragment中提前绑定了回调,常规用户操作下确实不会出现解绑后回调触发的情况,但Android Studio的静态检查会对所有异步回调中的生命周期敏感调用给出警告,避免遗漏异常场景。
最优修复方案
你完全不需要通过Fragment拿Context,直接使用回调中EditText自带的Context即可,既满足需求,又完全规避生命周期风险,不会再触发警告:
@Override public void onBindEditText(@NonNull EditText editText) { editText.setInputType(InputType.TYPE_CLASS_NUMBER); editText.setText(""); editText.setBackground(ContextCompat.getDrawable(editText.getContext(), R.drawable.fondo_edittextpreference)); }
兜底兼容方案
如果你一定要通过Fragment拿Context,需要先判断Fragment当前是否已附着到Activity:
@Override public void onBindEditText(@NonNull EditText editText) { editText.setInputType(InputType.TYPE_CLASS_NUMBER); editText.setText(""); if (isAdded()) { editText.setBackground(ContextCompat.getDrawable(requireActivity().getApplicationContext(), R.drawable.fondo_edittextpreference)); } }
内容的提问来源于stack exchange,提问作者Mike087
相关产品推荐
相关产品推荐

