在运行时从另一个应用程序获取自定义视图

3

我正在思考如何从另一个应用程序中获取CustomView的想法。 假设我有两个应用程序A和B。 我知道CustomView的包名称,例如com.applicationb.CustomView。 是否可能在运行时在应用程序A中创建此类的对象?

我的目标是找到一种方法来创建CustomViews并能够在我的应用程序中显示它们。 但我希望它们(视图)成为单独的apk,可以发布到Android市场,并作为某种扩展程序进行下载。

CustomView只会在屏幕上显示某种动画(例如落叶)。 它不会处理第一个应用程序中的任何数据。

编辑

我发现了这样的内容:

@SuppressWarnings("rawtypes")
Class c = Class.forName(package_name);
Method m = c.getDeclaredMethod(method_name);
m.setAccessible(true);
Canvas can= (Canvas) m.invoke(null, null); // since there are no parameters, and called function is static

我希望这会有效。我会让你知道。


1
不,你不能访问“views”,但是你可以使用“startActivity(Intent intent)”启动另一个应用程序中包含的“Activity”。这是相当基础的内容 - 我建议你阅读有关应用程序基础知识的文档 - http://developer.android.com/guide/topics/fundamentals.html - Squonk
我不想使用其他包中的任何活动或服务。我只想使用一个函数,例如getCanvas(),它将返回画布到我的应用程序。其背后的想法是其他开发人员可以编写自己的代码来绘制画布,而我可以在我的应用程序活动中进行绘制。 - Jakub Szczygieł
为什么不使用一个安卓库呢? - Macarse
1个回答

6

我如约而至,这是结果。

String packageName = "com.exapmle.sth";
String className = "com.exapmle.sth.CustomView";

String apkName = getPackageManager().getApplicationInfo(
    packageName, 0).sourceDir;
PathClassLoader myClassLoader = new dalvik.system.PathClassLoader(
    apkName, ClassLoader.getSystemClassLoader());
Class<?> handler = Class.forName(className, true, myClassLoader);
Constructor[] m = handler.getConstructors();
for (int i = 0; i < m.length; i++) {
    if (m[i].getName().contains("CustomView")) {
        animation = (View)m[i].newInstance(new Object[] { this });
        rootRL.addView(animation, new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.FILL_PARENT,
            RelativeLayout.LayoutParams.FILL_PARENT));
    }
}

使用这段代码可以在应用程序A中获取应用程序B的视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接