【问题标题】:Shared Preference doesn't save Drawable Resource Ids correctly if updated drawable folder如果更新可绘制文件夹,共享首选项不会正确保存可绘制资源 ID
【发布时间】:2018-08-14 19:09:40
【问题描述】:

我有一个自定义对象 Card()` public Card(String Element , String Color , int ResourceId , int CardNumber ,String Special){

    mResourceId = ResourceId ;
    mCardNumber = CardNumber ;
    mElement = Element ;
    mColor = Color ;
    mSpecial=Special;
}`

mResourceId 是卡片图像的可绘制对象 当我将 Card 类型的 Arraylist 保存到 Shared Preference,然后将单个图像添加到可绘制文件夹并更新应用程序时,Arraylist 的所有 Card ResourceId 都混合在一起并且无法正确显示The normal images of the arraylist of Cards

incorrect images replace the cards after adding some new images to the drawable folder and updating the app

我确信我添加到可绘制文件夹的新图像名称与现有图像的任何名称都不匹配

public class Card implements Parcelable{
private int mResourceId, mCardNumber;
private String mColor, mElement,mSpecial,mResId;

public Card(String Element , String Color , int ResourceId , int CardNumber ){

    mResourceId = ResourceId ;
    mCardNumber = CardNumber ;
    mElement = Element ;
    mColor = Color ;
}

public Card(String Element , String Color , String ResourceId , int CardNumber ){

    mResId = ResourceId ;
    mCardNumber = CardNumber ;
    mElement = Element ;
    mColor = Color ;
}


public Card(String Element , String Color , int ResourceId , int CardNumber ,String Special){

    mResourceId = ResourceId ;
    mCardNumber = CardNumber ;
    mElement = Element ;
    mColor = Color ;
    mSpecial=Special;
}


protected Card(Parcel in) {
    mResourceId = in.readInt();
    mCardNumber = in.readInt();
    mColor = in.readString();
    mResId = in.readString();
    mElement = in.readString();
    mSpecial = in.readString();
}

public static final Creator<Card> CREATOR = new Creator<Card>() {
    @Override
    public Card createFromParcel(Parcel in) {
        return new Card(in);
    }

    @Override
    public Card[] newArray(int size) {
        return new Card[size];
    }
};


public Object getResourceId() {
    if (mResId==null){return mResourceId;}
    else {return mResId;}

}

public int getResourceId(Context context) {
    try {
        return context.getResources().getIdentifier(mResId, "drawable", context.getPackageName());
    } catch (Exception e) {
        e.printStackTrace();
        return 0;
    }
}

public void setResourceId(int ResourceId) {this.mResourceId = ResourceId;}

public void setElement(String Element) {this.mElement = Element;}

public void setCardNumber(int CardNumber) {this.mCardNumber = CardNumber;}

public int getCardNumber() {
    return mCardNumber;
}

public String getCardElement() {
    return mElement;
}

public String getCardColor() {
    return mColor;
}

public String getSpecial() {
    return mSpecial;
}

public boolean isPowerCard(){
    boolean isspecial=false;
    if (mSpecial==null){isspecial= false;}
    else {isspecial= true;}
    return isspecial;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(mResourceId);
    dest.writeInt(mCardNumber);
    dest.writeString(mColor);
    dest.writeString(mElement);
    dest.writeString(mSpecial);
}

}

【问题讨论】:

  • 请注意R.whatever 资源大部分是在运行时生成的。我不确定你在问什么,但如果你想保存像图像这样的值,你必须将它们保存为 blob,或者使用高效的存储解决方案(如 Firebase)
  • @ArthurAttout 什么是 blob?
  • 代表二进制长对象。基本上,您存储整个图片本身,例如 JPG 或 PNG。如果您保存 R.drawable 值,它只是一个在运行时引用资源的 int。但断章取义完全没有意义

标签: java android


【解决方案1】:

资源 ID 是随着应用更新而动态生成的。因此在您的情况下它会失败。

您可以尝试将资源的名称存储在共享首选项中,并使用该名称获取资源的 id。

    Resources resources = getResources();
    String resourceName = resources.getResourceEntryName(R.drawable.resource);

然后您可以从共享首选项中检索 id。

intresId = resources.getIdentifier(resourceName, "drawable", "your.package.name");

【讨论】:

  • ,我确信字符串保存正确,但我需要更新大约 500 张卡片的声明,所以这将是时间成本,我还需要在 getResourceId() 方法中生成 id在我的 Card 类中,如何在非 Activity 类中引用 getResources?
  • 您需要活动上下文来调用方法getResourceId()。存储 id 是不可行和可实现的,因为它们每次都是动态生成的。您可以在每次更新应用程序时刷新共享首选项中的 id。
  • 感谢它的工作,我刚刚传递了一个参数上下文,但我现在需要更改我制作的大约 500 张卡片
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2013-08-31
  • 1970-01-01
相关资源
最近更新 更多