Android动态向数组XML资源添加项

Android动态向数组XML资源添加项,android,android-xml,Android,Android Xml,是否有任何方法可以将代码中的项添加到字符串数组资源?例如,如果我想创建一个显示用户值的微调器,并且我想允许用户添加自己的自定义值。否。这是不受支持的,因为资源打包在binary.apk中,因此无法更改 不要遵循这种设计模式,改变你的方法。也许JoxTraex对android框架一无所知,或者正如他们所说: 当有人说这件事做不到时,总会有人不知道,并且会去做:) 说到这里: Resources是一个开放类,它只是ResourcesImpl类的包装器 (使用折旧的构造函数-但可用) 在应用程序中,对

是否有任何方法可以将代码中的项添加到字符串数组资源?例如,如果我想创建一个显示用户值的微调器,并且我想允许用户添加自己的自定义值。

否。这是不受支持的,因为资源打包在binary.apk中,因此无法更改

不要遵循这种设计模式,改变你的方法。

也许JoxTraex对android框架一无所知,或者正如他们所说:

当有人说这件事做不到时,总会有人不知道,并且会去做:)

说到这里:

Resources是一个开放类,它只是ResourcesImpl类的包装器

(使用折旧的构造函数-但可用)

在应用程序中,对它的每次调用都是通过上下文进行的

因此:

1) 您始终可以提供自己的资源来实现

addResourceById(int,Object)
2) 或者(当它足够时)您自己的上下文实现(所以天空是极限)

。。。我现在开始关注“上下文实现”——是的,你甚至可以替换LoadedApk、Activity等中最顶层的上下文。。是吗,酷?但何时,如何?如何:通过反射,何时:好的应用程序设计师知道这个地方是(之前)第一次/任何调用此类对象的地方

但这里有一个危险的陷阱——在一个案例中,android直接将上下文打开到ContextImp,然后您需要返回这些上下文而不是您的上下文——我将为那些喜欢谜语的人保密的地方在哪里:)

资源方面也存在着问题

a) 一个隐藏的构造函数(最好的入口点,因为它不生成任何ReourceImpl(可以通过下面提到的方法设置)

b) 隐藏方法

setResImpl(ResourcesImpl) 
总结:

所以打电话

Resources.getStringArray(**not existing in APK resource id here**);
在我们自己的实现中,我们可以得到Cha想要的:)

更好的是,我们可以添加到我们的实现中

addResourceById(int,Object)
方法并添加新资源:)然后通过对资源的分配能力检查,我们将使用并向上转换实现:)使用新添加的方法:)

顺便说一句:如果有人对你说“你不应该这么做-布拉布拉布拉”,这就是最好的理由如果法律不允许:)

理论足够用于实践:

示例上下文实现将调用转发到getString:

    public class MyContext extends Context {
        ....
    // override context get resources method 
    @Override
    public android.content.res.Resources getResources() {
        // get super resources 
        android.content.res.Resources resources = super.getResources();
        // pull assets 
        android.content.res.AssetManager assets = resources.getAssets();
        // pull metrics 
        android.util.DisplayMetrics displayMetrics = resources.getDisplayMetrics();
        // pull configuration 
        android.content.res.Configuration configuration = resources.getConfiguration();
        // construct new anon resource implementation 
        return new android.content.res.Resources(assets, displayMetrics, configuration) {

            // overrride interesting method 
            @android.support.annotation.NonNull
            @Override
            public String getString(int id) throws android.content.res.Resources.NotFoundException {
                return id == pl.ceph3us.base.common.R.string.my_sweet_google
                    ? "fck_you_google";
                    : super.getString(id);
            }
        };
    }

}

你会建议使用数据库或文件来存储这样的东西吗?数据库可能是最容易与之交互的,所以是的,使用数据库。这就是谷歌为保存你以前的搜索所做的,以及它如何将你的搜索结果列入列表。这就是谷歌的精神:调整是因为你可以,并不意味着你应该这样做。你应该考虑维持这样一种神秘的方法的成本,这是不直接支持的。你可以做任何事,不管你是否应该做,这是你应该问的。在这种情况下,我不能说它值得这么复杂。您还应该考虑到资源是通过AsSeMeMeor使用的资源访问的一部分,ASSEMMIT是一个为资源构建的框架,主要是静态资源而不是动态的。请记住,这样做也可能破坏资源限定符的变体。听起来太冒险了。@JoxTraex这只是一个例子,任何门都可以打开——但是如果值得打开它们,使用哪把钥匙以及需要多少资源。。。但这是另一集。。。。
    public class MyContext extends Context {
        ....
    // override context get resources method 
    @Override
    public android.content.res.Resources getResources() {
        // get super resources 
        android.content.res.Resources resources = super.getResources();
        // pull assets 
        android.content.res.AssetManager assets = resources.getAssets();
        // pull metrics 
        android.util.DisplayMetrics displayMetrics = resources.getDisplayMetrics();
        // pull configuration 
        android.content.res.Configuration configuration = resources.getConfiguration();
        // construct new anon resource implementation 
        return new android.content.res.Resources(assets, displayMetrics, configuration) {

            // overrride interesting method 
            @android.support.annotation.NonNull
            @Override
            public String getString(int id) throws android.content.res.Resources.NotFoundException {
                return id == pl.ceph3us.base.common.R.string.my_sweet_google
                    ? "fck_you_google";
                    : super.getString(id);
            }
        };
    }

}