You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:43:52