如何在Android应用中使用Shared Preferences打开最近查看的PDF?
嘿,这个需求其实挺实用的,咱们一步步来搞定它:
实现FAB打开最近查看的PDF功能
1. 先记录用户查看的PDF
每次用户点击ListView里的PDF项打开文件时,咱们把这个PDF的绝对路径(或者你用来唯一标识它的信息)存到你已经定义好的SharedPreferences里,这样就能记住最近打开的文件了。
结合你给出的常量,代码可以这么写:
// 当用户点击ListView中的PDF项时,先拿到这个PDF的实际路径 String currentPdfPath = "这里替换成你从数据源获取的真实PDF路径"; // 获取SharedPreferences实例 SharedPreferences sharedPref = getSharedPreferences(mypreference, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); // 把当前PDF路径存起来 editor.putString(PDF, currentPdfPath); editor.apply(); // 用apply()异步保存更高效,也可以用commit()同步,推荐前者
2. 给FAB绑定点击事件,打开最近的PDF
在你的Activity里找到FAB控件,给它加个点击监听器,读取SharedPreferences里存的路径,然后调用你已经有的PDF打开逻辑就行。
示例代码:
FloatingActionButton fab = findViewById(R.id.your_fab_id); // 替换成你FAB的实际ID fab.setOnClickListener(v -> { // 读取保存的最近PDF路径 SharedPreferences sharedPref = getSharedPreferences(mypreference, Context.MODE_PRIVATE); String recentPdfPath = sharedPref.getString(PDF, null); if (recentPdfPath != null && !recentPdfPath.isEmpty()) { // 调用你已有的打开PDF的方法 openPdfFile(recentPdfPath); } else { // 如果用户还没查看过任何PDF,给个提示 Toast.makeText(this, "还没有查看过任何PDF哦", Toast.LENGTH_SHORT).show(); } }); // 假设你已经有打开PDF的方法,比如调用系统PDF查看器 private void openPdfFile(String pdfPath) { File pdfFile = new File(pdfPath); if (pdfFile.exists()) { // 用FileProvider避免Android 7.0+的权限问题 Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".provider", pdfFile); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "application/pdf"); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(intent); } else { Toast.makeText(this, "这个PDF文件已经不存在啦", Toast.LENGTH_SHORT).show(); } }
3. 进阶:保存最近多个PDF(可选)
如果你想让用户能选择最近查看的几个PDF,而不只是最后一个,可以用StringSet来保存多个路径:
保存多个PDF的逻辑
String currentPdfPath = "你的PDF路径"; SharedPreferences sharedPref = getSharedPreferences(mypreference, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); Set<String> recentPdfs = sharedPref.getStringSet("recent_pdfs_key", new HashSet<>()); // 先移除已有的这个路径,避免重复 recentPdfs.remove(currentPdfPath); // 添加到集合里,保证最新的在最前面 recentPdfs.add(currentPdfPath); // 限制最多保存5个,超过就删掉最早的 if (recentPdfs.size() > 5) { Iterator<String> iterator = recentPdfs.iterator(); iterator.next(); iterator.remove(); } editor.putStringSet("recent_pdfs_key", recentPdfs); editor.apply();
FAB点击弹出选择菜单
fab.setOnClickListener(v -> { SharedPreferences sharedPref = getSharedPreferences(mypreference, Context.MODE_PRIVATE); Set<String> recentPdfs = sharedPref.getStringSet("recent_pdfs_key", new HashSet<>()); if (recentPdfs.isEmpty()) { Toast.makeText(this, "还没有查看过任何PDF哦", Toast.LENGTH_SHORT).show(); return; } // 把集合转成List,方便处理 List<String> pdfList = new ArrayList<>(recentPdfs); // 创建弹出菜单,显示最近的PDF文件名 PopupMenu popupMenu = new PopupMenu(this, v); for (String pdfPath : pdfList) { File pdfFile = new File(pdfPath); popupMenu.getMenu().add(pdfFile.getName()); // 显示文件名更友好 } // 菜单点击事件 popupMenu.setOnMenuItemClickListener(item -> { String selectedFileName = item.getTitle().toString(); String selectedPath = null; // 找到对应的路径 for (String path : pdfList) { if (new File(path).getName().equals(selectedFileName)) { selectedPath = path; break; } } if (selectedPath != null) { openPdfFile(selectedPath); } return true; }); popupMenu.show(); });
几个注意点
- 一定要保存PDF的绝对路径,不然下次打开可能找不到文件;
- 打开前记得判断文件是否存在,避免崩溃;
- 如果用了FileProvider,要在Manifest里配置相关信息,解决Android 7.0+的文件访问权限问题。
内容的提问来源于stack exchange,提问作者Deb Prakash Chatterjee
相关产品推荐
相关产品推荐

