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

Android中SharedPreferences取布尔值返回默认值,无法关闭GalleryFragment

问题排查与解决方案

嘿,我帮你梳理下代码里的问题,以及怎么解决它:

核心问题:标记未正确写入SharedPreferences

先看你的Tab1代码,会发现大部分场景下你都没把requestFromTab1写入SharedPreferences:

  • 当权限已经通过时,你直接startActivity启动GalleryFragment,完全没执行写入标记的逻辑;
  • 当权限未通过时,你调用requestPermissions后立刻检查权限,但requestPermissions是异步操作——用户还没来得及授权,所以后续的if(checkWriteExternalPermission())分支根本不会触发,写入标记的代码自然也没跑。

另外Tab2的代码还没写完,连写入requestFromTab2的逻辑都缺失了,这肯定也拿不到值。

方案一:用Intent传递参数(更推荐)

其实用SharedPreferences传临时状态不太合适,因为它是持久化存储,容易留下残留值(比如用户从Tab1打开过一次后,下次从Tab2打开,SharedPreferences里的requestFromTab1还是true,逻辑会混乱)。更稳妥的方式是直接通过Intent的Extra传递标记:

修改Tab1的代码

首先修正点击事件,把标记放到Intent里:

uploadButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(checkWriteExternalPermission()){
            Intent intent = new Intent(getActivity(), GalleryFragment.class);
            intent.putExtra("requestFromTab1", true);
            startActivity(intent);
        } else{
            if(Build.VERSION.SDK_INT > Build.VERSION_CODES.M){
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001);
            }
        }
    }
});

然后处理权限申请的回调(因为权限申请是异步的,要等用户授权后再启动页面):

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == 1001){
        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            Intent intent = new Intent(getActivity(), GalleryFragment.class);
            intent.putExtra("requestFromTab1", true);
            startActivity(intent);
        }
    }
}

修改Tab2的代码同理

补全点击事件和权限回调:

uploadBtnTab2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(checkWriteExternalPermission()){
            Intent intent = new Intent(getActivity(), GalleryFragment.class);
            intent.putExtra("requestFromTab2", true);
            startActivity(intent);
        } else{
            if(Build.VERSION.SDK_INT > Build.VERSION_CODES.M){
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001);
            }
        }
    }
});

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == 1001){
        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            Intent intent = new Intent(getActivity(), GalleryFragment.class);
            intent.putExtra("requestFromTab2", true);
            startActivity(intent);
        }
    }
}

在GalleryFragment中获取参数

在GalleryFragment的onCreate或onViewCreated里读取Intent参数:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(getActivity() != null && getActivity().getIntent() != null){
        boolean fromTab1 = getActivity().getIntent().getBooleanExtra("requestFromTab1", false);
        boolean fromTab2 = getActivity().getIntent().getBooleanExtra("requestFromTab2", false);
        
        // 这里处理你的关闭逻辑,比如:
        if(fromTab1 || fromTab2){
            // 示例:关闭当前页面(如果GalleryFragment是作为Activity启动的)
            getActivity().finish();
            // 或者如果是用FragmentManager添加的,就用popBackStack()
            // getActivity().getSupportFragmentManager().popBackStack();
        }
    }
}

方案二:坚持用SharedPreferences的修正版

如果你一定要用SharedPreferences,那要确保每次启动前都正确写入,并且读取后立刻清除标记(避免残留):

Tab1的修正代码

uploadButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(checkWriteExternalPermission()){
            SharedPreferences preferences = getActivity().getSharedPreferences("MyPref",0);
            SharedPreferences.Editor editor = preferences.edit();
            // 先清空之前的标记,避免冲突
            editor.putBoolean("requestFromTab1", true);
            editor.putBoolean("requestFromTab2", false);
            editor.apply(); // apply()是异步写入,比commit()更高效
            startActivity(new Intent(getActivity(), GalleryFragment.class));
        } else{
            if(Build.VERSION.SDK_INT > Build.VERSION_CODES.M){
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001);
            }
        }
    }
});

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == 1001){
        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            SharedPreferences preferences = getActivity().getSharedPreferences("MyPref",0);
            SharedPreferences.Editor editor = preferences.edit();
            editor.putBoolean("requestFromTab1", true);
            editor.putBoolean("requestFromTab2", false);
            editor.apply();
            startActivity(new Intent(getActivity(), GalleryFragment.class));
        }
    }
}

GalleryFragment中读取并清除标记

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SharedPreferences preferences = getActivity().getSharedPreferences("MyPref",0);
    boolean fromTab1 = preferences.getBoolean("requestFromTab1", false);
    boolean fromTab2 = preferences.getBoolean("requestFromTab2", false);
    
    // 读取后立刻清除标记,防止下次打开时残留
    SharedPreferences.Editor editor = preferences.edit();
    editor.putBoolean("requestFromTab1", false);
    editor.putBoolean("requestFromTab2", false);
    editor.apply();
    
    // 处理关闭逻辑
    if(fromTab1 || fromTab2){
        getActivity().finish();
        // 或者用FragmentManager的方式关闭
    }
}

内容的提问来源于stack exchange,提问作者Chaitanya Reddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:07:13