在没有上下文的情况下获取 AssetManager

Posted

技术标签:

【中文标题】在没有上下文的情况下获取 AssetManager【英文标题】:Get AssetManager without context 【发布时间】:2013-05-19 09:12:17 【问题描述】:

是否可以在没有上下文的情况下访问 AssetManager?我见过其他人的解决方案是扩展Application,并将Context保存在onCreate()中,并创建一个静态getter来返回Context。我觉得这真的很草率,并且破坏了封装,因为您现在已经将 Context 中的所有内容授予整个应用程序的访问权限。我想我可以将其减少为仅保存 AssetManager,但这仍然是一个非常棘手的修复。

我知道你可以通过调用类似的东西来访问没有上下文的资源

Resources.getSystem().getString()

但是,通过

访问 AssetManager
Resources.getSystem().getAssets()

仅授予您访问某些内置资产的权限,而不授予您资产文件夹中的实际内容。

我是否坚持使用 hacky Application 子类,还是有更清洁的方法?

【问题讨论】:

为什么你认为保存应用程序上下文是草率的?你可以把它放在同一个类中,然后像任何其他单例一样调用 getInstance()... 【参考方案1】:

你需要资产做什么?只是为了打开文件?使用getResourceAsStream方法可以在没有上下文的情况下访问资源文件,但它们必须与java源文件放在同一文件夹中。

【讨论】:

啊,我明白了。我使用 Assets 的原因是因为我正在开发一个游戏引擎,我的想法是将配置文件(所有游戏的内容)放入 assets 文件夹中,使引擎和内容分开。使用 assets/ 而不是 res/ 的原因是因为 assets 允许使用文件夹。游戏引擎相当复杂,因此将所有内容存储在一个文件夹中是不可行的。 另外,我试图将 android 特定的操作系统调用提取到顶层,以便我可以轻松地将引擎移植到任何具有 JVM 的操作系统,这就是为什么我可以t 将上下文作为参数传递。

以上是关于在没有上下文的情况下获取 AssetManager的主要内容,如果未能解决你的问题,请参考以下文章

在 VStack 中使用列表时获取“表达式类型在没有上下文的情况下不明确”

Android之AssetManager使用

有没有办法在不使用画布 API 的情况下从图像文件中获取二进制数据?

手机如何读取assets隐藏目录

System.web.optimization AssetManager 增加内存使用率

如何在给定上下文的情况下获取布局充气器?