Android上的R类有它的局限性。您无法动态使用资源来加载音频,图片或其他内容。例如,如果您不想为选择的对象加载一组音频文件,则无法执行以下操作:
R.raw."string-upon-choosen-object"
我是android的新手,至少我没有找到你能做到的,取决于选择的对象或比这更动态的东西。所以,我想过用一点内存开销让它变得动态。但是,我怀疑它是否值得,或者只是与外部资源不同。
修改ant build xml以执行我自己的任务。这个任务是一个java程序,它解析R.java文件,用它的对(key,value)构建一组HashMaps。我已经手动完成了这项工作并且工作正常。所以我需要一些专家代言。
这就是我管理整个事情的方式:
生成基础Application
类,例如MainApplicationResources
构建所有require方法和属性。然后,您可以访问调用getApplication()
然后调用所需方法的方法。
这样的事情:
package [packageName]
import android.app.Application;
import java.util.HashMap;
public class MainActivityResources extends Application {
private HashMap<String,Integer> [resNameObj1];
private HashMap<String,Integer> [resNameObj2];
...
private HashMap<String,Integer> [resNameObjN];
public MainActivityResources() {
super();
[resNameObj1] = new HashMap<String,Integer>();
[resNameObj1].put("[resNameObj1_Key1]", new Integer([resNameObj1_Value1]));
[resNameObj1].put("[resNameObj1_Key2]", new Integer([resNameObj1_Value2]));
[resNameObj2] = new HashMap<String,Integer>();
[resNameObj2].put("[resNameObj2_Key1]", new Integer([resNameObj2_Value1]));
[resNameObj2].put("[resNameObj2_Key2]", new Integer([resNameObj2_Value2]));
...
[resNameObjN] = new HashMap<String,Integer>();
[resNameObjN].put("[resNameObjN_Key1]", new Integer([resNameObjN_Value1]));
[resNameObjN].put("[resNameObjN_Key2]", new Integer([resNameObjN_Value2]));
}
public int get[ResNameObj1](String resourceName) {
return [resNameObj1].get(resourceName).intValue();
}
public int get[ResNameObj2](String resourceName) {
return [resNameObj2].get(resourceName).intValue();
}
...
public int get[ResNameObjN](String resourceName) {
return [resNameObjN].get(resourceName).intValue();
}
}
我是否会添加太多内存使用设备?值得吗?
此致
答案 0 :(得分:2)
我是android的新手,至少我 没找到你怎么能这样做, 取决于选择的对象 或者比那更有活力的东西。
Resources
类有一个getIdentifier()
方法,它将为您提供名称为字符串的资源ID。这使用反射,因此您可能希望缓存结果,可能使用LinkedHashMap
作为LRU缓存。
恕我直言,不是真的。我会使用值得吗?
getIdentifer()
或直接使用反射。事实上,我自己直接使用反射(使用LRU缓存)来解决这个问题。