如何将图像、字符串和整数结合在易于维护的格式中

4
所以,我正在尝试找出最好的方法来组合许多数据类型。在我的代码内部,我正在创建一个类。在外部,我希望有一个单一的地方去管理以下类型的数据,或至少是指向这些数据的指针。请注意,有很多这些数据集,并且我预计随着时间的推移会添加更多。
编辑:我正在大量简化曾经存在的内容。
想象一下,在编译时,我有一个对象列表。每个对象都有一些特征,所有对象都将共享这些特征。这些包括:
  • 一个图像
  • 一些字符串
  • 一个整数数组
  • 一个字符串数组
我想找到一种将所有这些数据存储在任何代码之外的方法。理想情况下,我想使用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,可能可行,但我不确定它们是否可以在用户方面进行更新。


我可能没有完全理解这个问题。不过,如果您创建了一个Object的子类来存储所有这些信息,然后编写一个方法将其全部放入JSON对象中,再将该JSON对象的字符串存储在Preferences中,那么当然您需要编写反序列化方法以在运行时从JSON字符串重新构建对象。这对您的情况听起来可用吗? - dennisdrew
R.drawable.your_image是一个整数。你能不能存储这个整数值呢?例如:jsonObject.putInt("ImageResId",R.drawable.your_image) - dennisdrew
我不确定这是可能的。你需要访问资源ID才能链接到资源文件夹中的实际图像。我将发布一个答案,其中包含我认为可能有效的解决方案 :) - dennisdrew
@dennisdrew:这就是为什么我在上面设置了赏金,并且一直在苦苦挣扎的原因。除此之外,我还添加了伪代码,希望它能更好地解释我的意思。 - PearsonArtPhoto
我已经尝试大幅重写问题,以显著提高理解能力。希望这样会更好。 - PearsonArtPhoto
显示剩余7条评论
3个回答

2

在得到这个问题的帮助后,我能够找到一个解决方案。

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

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中,并在运行时需要时进行恢复。


1

SharedPreferences是一种选择,但在这种情况下,即使您只需要更改值,以后也必须更改代码。另一方面,xml方式更加灵活。

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

当然,xml的开销将是读取器/编写器部分。


我不担心运行时的开销,因为所有操作都将在初始化时完成,但我担心可维护性。然而,我仍然无法弄清楚如何包含图像文件... - PearsonArtPhoto
是的,图像文件会有些棘手。最好的方法是将图像包含在drawable文件夹中,并将其ID /名称保存为字符串,以便选择保存设置。我建议这样做是因为我认为您没有太多的图像。 - Shubhayu
我在解析时遇到了麻烦... 我已经将图像保存在drawable文件夹中,但我不知道如何将它们传递到XML文件中... - PearsonArtPhoto
好的,假设图片名为myimage.png。将文件保存在drawable文件夹中。在您的xml文件中保存图像的名称,例如myimage。现在,当您想要检索它时,请使用activity/application上下文通过执行以下操作将其获取回来。int imgId = context.getResources().getIdentifier(); Drawable image = context.getResources().getDrawable(imgId); 只需查看getIdentifier()的语法即可。 - Shubhayu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接