【问题标题】:How to combine sets of Images, Strings, and Integers, in an easy to maintain format如何以易于维护的格式组合图像、字符串和整数集
【发布时间】:2012-03-18 01:02:34
【问题描述】:

所以,我正在尝试找出将多种数据类型组合在一起的最佳方式。在我的代码内部,我正在创建一个类。在外部,我希望有一个地方可以管理以下类型的数据,或者至少是指向所述数据的指针。请注意,这些数据有很多组,我预计随着时间的推移会增加更多。

编辑:我大大简化了这里曾经的内容。

想象在编译时,我有一个对象列表。每个对象都有一些特征,所有对象都将具有这些特征。其中包括:

  • 图像图像
  • 一些字符串
  • 整数数组
  • 字符串数组

我想找到一种方法将所有这些存储在任何代码之外。理想情况下,我想使用 XML,看起来像这样:

<storage_type>
   <image resid="@id/image1" />
   <name>Item_Name1</name>
</storage_type>
<storage_type>
   <image resid="@id/image2" />
   <name>Item_Name2</name>
</storage_type>

图像当前存储为资源变量。我只是不确定如何将图像引用放入 XML 文件中。

如果能找到更好的解决方案,我不会接受 XML 文件的想法。我想要的只是一个访问这些信息的某种方式的单一数据库。

除非我提交新的更新,否则不应更改此数据。这些不需要在运行时更新,但我肯定想在构建之间不时更新它们。我听说过 Preferences,它可能有效,但我不确定它们是否可能是用户可更新的.

【问题讨论】:

  • 所以我得到的是,这些是您不希望用户更改但您希望它们在应用程序存在时可用的东西。如果您更新代码以更改这些值,那么只有这些值才应该更新?
  • @Shubhayu:嗯,我希望能够为将来的版本更新它们,添加/删除/更改内容,但我绝对不希望用户能够更新它们。不过,我不会在运行时更新这些内容。
  • 我可能没有完全理解这个问题。但是,如果您创建了一个 Object 的子类来存储所有这些信息,然后编写一个方法将其全部放入 JSON 对象,然后将该 JSON 对象的 String 存储在 Preferences 中。然后当然你会编写反序列化方法来在运行时从 JSON 字符串重新构造对象。对于您的情况,这听起来是否可以远程使用?
  • 我试图添加一些说明。让我知道它是否有帮助。 JSON 是可能的,但我不知道如何将指向图像资源的指针放入 JSON 流中......
  • R.drawable.your_image 是一个整数。你不能存储那个整数值吗? IE。 jsonObject.putInt("ImageResId",R.drawable.your_image)

标签: android xml string android-xml maintainability


【解决方案1】:

this question 的大力帮助下,我找到了解决方案。

  1. 我的数据存储在一个 XML 数组中。
  2. 此数据包含一个数组索引,该索引指向一个图像数组,在正常资源下维护。

我的数据存储文件如下:

<storage_type>
   <image imageArrayIndex="1" />
   <name>Item_Name1</name>
</storage_type>
<storage_type>
   <image imageArrayIndex="2" />
   <name>Item_Name2</name>
</storage_type>

我的 res/values 文件夹中有一个文件,如下所示:

<resources>
    <string-array name="images">
        <item>@drawable/default</item>
        <item>@drawable/image1</item>
        <item>@drawable/image2</item>
    </string-array>
</resources>

在解析 XML 代码的某个地方,我有:

TypedArray imgs = context.getResources().obtainTypedArray(R.array.achievement_images);
//Whole bunch of code to parse XML, eventually coming to this line:
else if (name.equals("image"))
{
  imageRes=imgs.getResourceId(xpp.getAttributeIntValue(null,"imageArrayIndex", 0),-1);
}

或者,我可以简单地存储图像的名称,如下所示:

<storage_type>
   <image resid="image1" />
   <name>Item_Name1</name>
</storage_type>
<storage_type>
   <image resid="image2" />
   <name>Item_Name2</name>
</storage_type>

然后通过解析xml标签获取资源ID,通过:

int resid=Context.getResources().getIdentifier (name_string_Image, "drawable", null);

【讨论】:

    【解决方案2】:

    SharedPreferences 是一个选项,但在这种情况下,即使您只需要更改值,您也必须在代码中进行更改。而xml方式则更加灵活。

    将来,如果您只想更改设置的值,请​​更改 xml 文件并将其推送到用户的手机。无需更改代码,经历测试周期等。如果您想添加/删除东西,那么任何一种方式都需要更改代码(特别是添加部分)

    xml 的开销当然是读取器/写入器部分。

    【讨论】:

    • 我不担心运行时的开销,因为这一切都会在初始化时完成,但我担心可维护性。不过,我不知道如何包含图像文件...
    • 是的,图像文件会很棘手。最好的方法是将图像包含在可绘制文件夹中,并在您选择的保存设置中将 ids/names 保存为字符串。我建议这个因为我认为你没有太多的图像。
    • 我在解析时遇到问题...我在可绘制文件夹中保存了图像,但我不知道如何将它们传递给 XML 文件...
    • ok 这样做,假设图像名称是 myimage.png。将文件保存在您的可绘制文件夹中。并在您的 xml 文件中保存图像的名称,即 myimage。现在,当您要检索它时,请使用活动/应用程序上下文通过执行此操作将其取回。 int imgId = context.getResources().getIdentifier();可绘制图像 = context.getResources().getDrawable(imgId);只需查看 getIdentifier() 的语法即可。
    【解决方案3】:

    我认为您可以创建一个自定义对象来存储这些值并具有将其输出到 JSON 字符串(用于存储在 Prefs 中)并通过接收 JSON 字符串进行重构的方法。您还可以使用返回对象图像的方法。这是我写的一个示例类:

    public class MyObject {
        private static final String IMAGE_RES_ID = "ImageResId";
        private static final String STRING1 = "String1";
        private static final String STRING2 = "String2";
        private static final String INT_ARRAY = "IntArray";
        private static final String STRING_ARRAY = "StringArray";
    
        private int mImageResId;
        private String mString1, mString2;
        private int[] mIntArray;
        private String[] mStringArray;
    
        public MyObject(int imageResId, String s1, String s2, int[] intArray,
                String[] stringArray) {
            mImageResId = imageResId;
            mString1 = s1;
            mString2 = s2;
            mIntArray = intArray;
            mStringArray = stringArray;
        }
    
        public MyObject(String jsonString) throws JSONException {
            JSONObject jsonObject = new JSONObject(jsonString);
    
            // Get single values
            mImageResId = jsonObject.getInt(IMAGE_RES_ID);
            mString1 = jsonObject.getString(STRING1);
            mString2 = jsonObject.getString(STRING2);
    
            // Get arrays
            JSONArray intArray = jsonObject.getJSONArray(INT_ARRAY);
            mIntArray = new int[intArray.length()];
            for (int i = 0; i < mIntArray.length; i++)
                mIntArray[i] = intArray.getInt(i);
    
            JSONArray stringArray = jsonObject.getJSONArray(STRING_ARRAY);
            mStringArray = new String[stringArray.length()];
            for (int i = 0; i < mStringArray.length; i++)
                mStringArray[i] = stringArray.getString(i);
        }
    
        public int getImageResId() {
            return mImageResId;
        }
    
        public String getString1() {
            return mString1;
        }
    
        public String getString2() {
            return mString2;
        }
    
        public int[] getIntArray() {
            return mIntArray;
        }
    
        public String[] getStringArray() {
            return mStringArray;
        }
    
        public Drawable getImageDrawable(Context context) {
            return context.getResources().getDrawable(getImageResId());
        }
    
        private JSONObject toJsonObject() throws JSONException{
            JSONObject toReturn = new JSONObject();
    
            // Put single values
            toReturn.put(IMAGE_RES_ID, getImageResId());
            toReturn.put(STRING1, getString1());
            toReturn.put(STRING2, getString2());
    
            // Put arrays
            JSONArray intArray = new JSONArray();
            for (int value : mIntArray)
                intArray.put(value);
    
            JSONArray stringArray = new JSONArray();
            for (String value : mStringArray)
                stringArray.put(value);
    
            toReturn.put(INT_ARRAY, intArray);
            toReturn.put(STRING_ARRAY, stringArray);
    
            return toReturn;
        }
    
        public String toJsonString() throws JSONException {
            return toJsonObject().toString();
        }
    }
    

    一旦你拥有了你想要保存的所有相关信息,就构建它。然后将 toJsonString() 的结果存储在 SharedPreferences 中,并在需要时在运行时恢复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多