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
相关产品推荐
相关产品推荐

