Android动态添加项目到阵列XML资源

时间:2012-02-03 09:41:54

标签: android android-xml

有什么方法可以将代码中的项添加到String-Array资源中?例如,如果我想创建一个显示用户值的微调器,我想允许用户添加自己的自定义值。

2 个答案:

答案 0 :(得分:7)

没有。这是不受支持的,因为资源打包在二进制.apk中,因此无法更改。

请勿按照此设计模式更改您的方法。

答案 1 :(得分:3)

可能 JoxTraex 对Android框架或他们说的不知道:

当有人说不能这样做时 - 总会有人不知道并会这样做:)

所以要点:

资源是一个开放类只是ResourcesImpl类的包装器

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

public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config)

在app中,每次调用都是通过Context

进行的

这样:

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

2)或(当它足够时)你自己的Context实现(所以天空是极限)

...我现在感觉眼睛“上下文实现” - 是的,你甚至可以替换LoadedApk,Activity等中最顶层的上下文。是的很酷?但是,何时,如何?如何:通过反思,何时:优秀的应用程序设计师知道这个地方是在(之前)的第一个/对此类对象的任何调用... ...

但是这里有一个危险的捕获 - 在一个案例中android直接解开Context到ContextImp然后你需要返回那些上下文而不是你的 - 在那里我将保留为那些喜欢谜语的人的秘密:) / p>

还有资源

a)隐藏的构造函数(最佳入口点,因为它没有制作任何ReourceImpl(可以通过下面提到的方法设置)

public Resources(@Nullable ClassLoader classLoader) 

b)隐藏方法

setResImpl(ResourcesImpl) 

总结:

所以通过调用

Resources.getStringArray(**not existing in APK resource id here**);

关于我们自己的实现,我们可以得到什么:) :)

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

addResourceById(int,Object)

方法并添加新资源:)然后使用分配能力检查我们将使用的资源并对我们的实现进行向上转换:)以使用我们新添加的方法:)

btw:如果有人对你说“你不应该这样做 - blablabla”这是做这件事的最好理由! - 如果法律不允许:)

足够的理论去实践:

示例上下文实现将调用转发给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);
            }
        };
    }

}