我的工作有些重复使用安卓代码,我想要分发到其他开发商利用自己的应用程序。代码中有一些资源的依赖(布局,xml&png可绘),我希望能够包括并参考在一个软件包(罐子文件)。

这是可能的,并且如果那么,什么是最好的方法做到这一点?

有帮助吗?

解决方案

我没有给你任何乐观的消息。一般来说,你可以不容易,你会希望分发自己的包。主要问题是自动生成的R档。你可能对它做一些参考 - 你有你的布局和绘图。库的用户都会有自己的R档 - 包含IDS他的资源,而不是为你的库提供的。

在绘制资源的情况下,你可以在经典的方式阅读,无须R档。但据我所知,你是不是能够从充气外部XML文件的布局。

因此,丑陋的黑客在这里将你所有的资源,用户必须复制到自己的“资源”文件夹中的库一起分发。说实话,也没有很好的解决你的问题...对不起。 此致!

其他提示

由于让安卓 R 类自动用资源下的文件 /res 文件夹,用 Rfinal static 是不可能的。

我发现了一个很好的解决方案使用一个 jar 文件的 res 文件。这里是我怎么做:

  1. 在你的源代码,它将在出口 jar 文件, 不要用 R 可变的,因为它将取代与一个最终的静态存储器的地址在编制时间。而不是使用 R, 我做我自己的方法如下:

    public static int getResourceIdByName(String packageName, String className, String name) {
        Class r = null;
        int id = 0;
        try {
            r = Class.forName(packageName + ".R");
    
            Class[] classes = r.getClasses();
            Class desireClass = null;
    
            for (int i = 0; i < classes.length; i++) {
                if (classes[i].getName().split("\\$")[1].equals(className)) {
                    desireClass = classes[i];
    
                    break;
                }
            }
    
            if (desireClass != null) {
                id = desireClass.getField(name).getInt(desireClass);
            }
    
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    
        return id;
    }
    

    例如,如果你有一个布局命名的 main.xml, 你可以得到它通过调用的方法:

    int id = getResourceIdByName(context.getPackageName(), "layout", "main");
    

    如果你有一串的 id 是"文本1",你可以得到它的叫法

    int id = getResourceIdByName(context.getPackageName(), "string", "text1");
    

    这种方法让你有你的资源id在运行时间。它使用反射API得到的地位 R 在运行时间。

    通过使用这种方法可以避免使用 R 变量。

  2. 复制你 res 文件的目标的项目。

  3. 建立。


布局:

在Java源代码硬


的xml&PNG:

复制的xml&PNG到项目src文件夹和封装到罐子中,例如

复制a.png为src / COM /示例/测试

加载它如下的java代码:

    InputStream is = YourClassName.class.getClassLoader().getResourceAsStream("com/example/test/a.png");
    if ( null != is )
    {
          Bitmap bmp = BitmapFactory.decodeStream(is);

我刚发现,在Android SDK的aapt工具允许下列选项:

   --non-constant-id
       Make the resources ID non constant. This is required to make an R java class
       that does not contain the final value but is used to make reusable compiled
       libraries that need to access resources.

这声音有前途的,虽然我没有试过,所以我还没有线索,如果它的工作原理。我怀疑这是要解决要解决的问题通过@ J.J.Kim的岗位之上。

您可以动态地采用了android方法来获取资源ID。

int preferences = context.getResources().getIdentifier("preferences", "xml", context.getPackageName());

后来你的资源已经被列入(复制)到您的新项目。

我用 user558185 溶液但这里是一个更简单的方法。如果你的资源是在一个库项目(一科尔多瓦插件为例),你可以得到context.getResources().getIdentifier(name, className, context.getPackageName());资源

此发生时,不正确生成的库项目资源R档和将R的packageName没有由库项目匹配所需的packageName。

在使用相同user558185的答案,但是它使用一个原生Android方法。

嗨,我认为这是一个迟到的反应,但仍然我怎么告知AAR

Android的归档 - 这个文件可以保存你的资源和清单文件,以便其他开发可以直接导入AAR他们的项目和编译他们的代码

这个方式,我们可能会得到清单合并错误,修复它使用在你的清单代替财产,这应该分配前进行检查。

可以使用抽象从实现类(用户)得到的R值。

protected abstract void getMyLayoutTextBox(int myLayoutTextBox);

然后,用户必须扩展类(其延伸Activity),和实现此方法。在你的类,你只需要调用getMyLayoutTextBox()他实现你分发的JAR后,你就会有用户提供正确的R值。

您可以阅读更多有关抽象这里

如果您使用的是Eclipse,去项目"Properties->Java Build Path"。在标签"Source",文件夹,你要打包添加资源的(例如RES / RAW)

这将添加以下行成.classpath文件,点击     的

建设完成后,新的JAR文件将包含在res/raw/文件夹中的文件。您可以访问他们的 user558185 建议。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top