如何在外部非活动类(插件)中使用本地资源



我正在尝试为我的"活动"设计一个插件系统。为了做到这一点,我创建了一个名为PluginClass的新类,它在我的项目外部,并放入一个不同的包中,我用DEXClassLoader从我的主应用程序加载它。

我可以很容易地从主应用程序调用所有的PluginClass方法,而且它工作得很好。当我试图访问PluginClass项目的资源时,问题就出现了。让我解释一下:PluginClass用getInfratedBox方法将本地布局膨胀为一个主活动对象,如下所示:

public void getInflatedBox(ViewGroup root) {
        View.inflate(context, R.layout.boxeslayout, root);
        this.imgBoxX = (ImageView) root.findViewById(R.id.imgBoxX);
        this.imgNotify = (ImageView) root.findViewById(R.id.imgNotify);
        this.txtNotify = (TextView) root.findViewById(R.id.txtNotify);
        this.txtBoxXName = (TextView) root.findViewById(R.id.txtBoxXName);
        this.llShadow = (LinearLayout) root.findViewById(R.id.llShadow);
}

它应该将布局"boxeslayout"扩展到根对象中,来自带有此调用的主活动(我删除了try/catch以使其可读):

Method getInflatedBox = null;
BoxX root;
Class boxesPlugin = getPlugin();     // Another main activity method, 
                                     // where I obtain the class with DexClassLoader
pgItem = boxesPlugin.newInstance();
getInflatedBox = boxesPlugin.getMethod("getInflatedBox", ViewGroup.class);
getInflatedBox.invoke( pgItem, root );

其中BoxX是扩展LinearLayout的自定义类。

问题就出在这里:我得到了一个扩展到根实例的布局,但不是我想要的布局。实际上,R.layout.boxeslayout访问本地主活动资源,将恰好具有相同id值的活动的布局扩展到根。

由于我的PluginClass不是一个活动,我不能使用context.getResources。你知道我如何强迫PluginClass的方法访问插件资源吗?

非常感谢你的帮助。

好吧,不确定是否有人感兴趣,因为我在两周多的时间里观众太少了,但我找到了一个解决方案,也许它对其他人有用,所以我在这里发帖。

关键是我无法访问插件R类,所以我必须在方法getInfratedBox:中找到一个变通方法

Resources pgResources = null;
Context pgCtx = actContext.createPackageContext(packName, Context.CONTEXT_IGNORE_SECURITY);
pgResources = pgCtx.getResources();
int lLayoutID = pgResources.getIdentifier(layoutName, "layout", pgPackName);
View.inflate(pgCtx , lLayoutID, root);

其中actContext是调用主活动的上下文。

实际上,我获得了我想要扩展的布局的正确ID,通过本地上下文pgCtx获得了指向插件实际资源的指针,该上下文是从插件包pgPackName构建的。

希望这能有所帮助。

最新更新