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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:00:48