安卓调用ACTION_GET_CONTENT访问目录后如何按一次返回键回到主Activity
你当前实现的核心问题:你调用的ACTION_GET_CONTENT是系统提供的文件选择组件,运行在独立的进程中,你当前写的主页面onBackPressed方法在选择器前台展示时完全不会触发,这是你原有逻辑无效的根本原因。
解决方案
方案1:自定义文件选择器(可控性最高)
完全自己实现目录遍历、文件列表展示的页面,所有交互逻辑可自定义:
- 重写自定义选择页的
onBackPressed方法,直接finish掉选择页回到主视图,不需要逐层返回上级目录 - 可随意添加你需要的悬浮“返回主界面”按钮,点击直接跳转回主视图
- 不需要依赖系统组件,适配性更稳定
方案2:基于现有系统选择器优化
系统选择器本身不支持自定义返回逻辑和插入按钮,只能通过返回结果处理逻辑调整:
第一步:修正现有代码错误
你原有onActivityResult的判断条件写错,且onBackPressed逻辑完全无效,先清理错误代码:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ...原有其他逻辑 projectList.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(Intent.ACTION_GET_CONTENT) .setType("file/*"); // 这里原来的setResult是多余的,启动选择器不需要提前设置结果 startActivityForResult(i, CODE_SEE_FOLDER); } }); } // 移除你原来写的错误的onBackPressed代码,完全没用 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == CODE_SEE_FOLDER){ if(resultCode == RESULT_OK){ // 处理用户选中文件的逻辑 Toast.makeText(context, "Your projects..", Toast.LENGTH_SHORT).show(); }else{ // 用户按返回直到退出选择器,直接回到主视图状态即可 // 如需刷新主视图在这里加刷新逻辑,不需要调用recreate()避免页面闪烁 } } }
第二步:实现选择器内一键返回变通方案
如果需要在选择器页面有一键回到主视图的按钮,可以申请悬浮窗权限:
- 动态申请
SYSTEM_ALERT_WINDOW悬浮窗权限 - 启动选择器的同时弹出全局悬浮按钮,点击按钮时调用
finishActivity(CODE_SEE_FOLDER)直接关闭系统选择器,回到主视图
内容的提问来源于stack exchange,提问作者Asya
相关产品推荐
相关产品推荐

