如何将Activity转为Fragment?权限代码适配Fragment指南
把权限申请代码从Activity迁移到Fragment的修改指南
嘿,把权限申请逻辑从Activity移到Fragment其实不难,主要是调整上下文引用和改用Fragment自身的权限API,我给你拆解一下具体要改的地方:
1. 调整 checkPermission 方法
原代码里依赖MainActivity.this作为上下文,在Fragment里我们需要替换为Fragment的关联上下文,推荐用requireContext()(它会确保上下文非空,避免空指针异常),同时可以简化返回逻辑:
private boolean checkPermission() { int result = ContextCompat.checkSelfPermission(requireContext(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE); return result == PackageManager.PERMISSION_GRANTED; }
2. 修改 requestPermission 方法
Fragment自身就提供了权限申请的相关方法,不需要再依赖ActivityCompat工具类:
- 把
ActivityCompat.shouldShowRequestPermissionRationale替换为Fragment原生的shouldShowRequestPermissionRationale方法,直接传入权限参数即可 - 把
ActivityCompat.requestPermissions替换为Fragment自身的requestPermissions方法,无需传递Activity实例
修改后的代码:
// 先在Fragment里定义请求码常量 private static final int PERMISSION_REQUEST_CODE = 100; private void requestPermission() { if (shouldShowRequestPermissionRationale(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Toast.makeText(requireContext(), "Please allow this permission in App Settings.", Toast.LENGTH_LONG).show(); } else { requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } }
3. 重写Fragment的 onRequestPermissionsResult 方法
原来的权限回调是在Activity里实现的,现在要把逻辑移到Fragment中,同时使用Fragment的上下文显示Toast,记得要调用super方法保证回调链正常:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case PERMISSION_REQUEST_CODE: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(requireContext(), "Permission Granted Successfully! ", Toast.LENGTH_LONG).show(); } else { Toast.makeText(requireContext(), "Permission Denied :( ", Toast.LENGTH_LONG).show(); } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }
额外注意事项
- 务必在Fragment已经依附于Activity之后再触发权限申请,比如在
onViewCreated或onStart生命周期方法里调用,避免requireContext()返回空 - 如果你的Activity原来也有
onRequestPermissionsResult方法,一定要保留super.onRequestPermissionsResult(requestCode, permissions, grantResults);,这样Fragment的回调才能被正确触发
内容的提问来源于stack exchange,提问作者aysa
相关产品推荐
相关产品推荐

