我正在尝试为我的活动设计一个插件系统。为此,我创建了名为 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 的方法访问插件资源吗?
非常感谢您的帮助。