如何以易于维护的格式组合图像,字符串和整数集

时间:2012-03-18 01:02:35

标签: android xml string android-xml maintainability

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

编辑:我正在大规模简化曾经的事情。

在编译时成像,我有一个对象列表。每个对象都有一些特征,所有对象都有共同之处。其中包括:

  • imageImage
  • 一些字符串
  • 整数数组
  • 字符串数组

我想找到一种方法将所有这些存储在任何代码之外。理想情况下,我想使用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文件的想法没有结合。我想要的只是一个访问这些信息的单一数据库。

除非我提交新的更新,否则不应更改此数据。这些不需要在运行时更新,但我肯定希望在构建之间不时更新它们。我听说过可能有用的偏好设置,但我不确定它们是否可能以某种方式用户可更新

3 个答案:

答案 0 :(得分:2)

我能够在this question的帮助下找到解决方案。

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

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

答案 1 :(得分:1)

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

将来,如果您只想更改设置的值,请​​更改xml文件并将其推送到用户的手机。无需更改代码,完成测试周期等。如果您想添加/删除内容,则无论哪种方式都需要更改代码(特别是添加部分)

xml ofcourse的开销,将是读者/作者部分。

答案 2 :(得分:1)

我认为您可以创建一个存储这些值的自定义对象,并有一个方法将其输出到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中,并在需要时在运行时恢复。