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について聞いたことがありますが、うまくいくかもしれませんが、何らかの方法でユーザーが更新できるかどうかはわかりません.

4

3 に答える 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);
于 2012-11-16T10:30:47.160 に答える
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 に保存し、必要に応じて実行時に復元します。

于 2012-11-15T17:12:41.227 に答える
1

SharedPreferences はオプションですが、その場合、後で値を変更する必要がある場合でも、コードを変更する必要があります。一方、xml の方法はより柔軟です。

将来、設定の値を変更するだけの場合は、xml ファイルを変更してユーザーの電話にプッシュします。コードを変更したり、テストサイクルを行ったりする必要はありません。また、何かを追加/削除したい場合は、どちらの方法でもコードを変更する必要があります (特に追加部分)。

もちろん、xml のオーバーヘッドはリーダー/ライター部分になります。

于 2012-03-18T03:32:46.853 に答える