Android:创建自定义资源类

时间:2010-04-01 22:14:13

标签: android

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();
      }
}

问题是:

我是否会添加太多内存使用设备?值得吗?

此致

1 个答案:

答案 0 :(得分:2)

  

我是android的新手,至少我   没找到你怎么能这样做,   取决于选择的对象   或者比那更有活力的东西。

Resources类有一个getIdentifier()方法,它将为您提供名称为字符串的资源ID。这使用反射,因此您可能希望缓存结果,可能使用LinkedHashMap作为LRU缓存。

  

值得吗?

恕我直言,不是真的。我会使用getIdentifer()或直接使用反射。事实上,我自己直接使用反射(使用LRU缓存)来解决这个问题。

相关问题