0

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

我可以轻松地从主应用程序调用所有 PluginClass 方法,并且工作正常。当我尝试访问 PluginClass 项目的资源时,问题就出现了。让我解释一下:PluginClass 使用 getInflatedBox 方法将本地布局膨胀到主活动对象中,如下所示:

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 的方法访问插件资源吗?

非常感谢您的帮助。

4

1 回答 1

1

好的,不确定是否有人对此感兴趣,因为我在两个多星期内的观众很少,但我想出了一个解决方案,也许它对其他人有用,所以我在这里发帖。

关键是我无法访问插件 R 类,所以我必须找到方法 getInflatedBox 的解决方法:

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 构建的。

希望这可以帮助。

于 2013-07-22T20:53:15.247 回答