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