Java 共享首选项不';如果更新了可绘制文件夹,则无法正确保存可绘制资源ID
我有一张自定义对象卡()` 公共卡(字符串元素、字符串颜色、int-ResourceId、int-CardNumber、字符串特殊){ mResourceId是一种可绘制的卡片图像 当我将Card类型的Arraylist保存到Shared Preference,然后将单个图像添加到drawable文件夹并更新应用程序时,Arraylist的所有Card ResourceId都是混合的,无法正确显示 我确信我添加到drawable文件夹的新图像的名称与现有图像的任何名称都不匹配Java 共享首选项不';如果更新了可绘制文件夹,则无法正确保存可绘制资源ID,java,android,Java,Android,我有一张自定义对象卡()` 公共卡(字符串元素、字符串颜色、int-ResourceId、int-CardNumber、字符串特殊){ mResourceId是一种可绘制的卡片图像 当我将Card类型的Arraylist保存到Shared Preference,然后将单个图像添加到drawable文件夹并更新应用程序时,Arraylist的所有Card ResourceId都是混合的,无法正确显示 我确信我添加到drawable文件夹的新图像的名称与现有图像的任何名称都不匹配 public c
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);
}
公共类卡实现可包裹{
private int mResourceId,mCardNumber;
私有字符串mColor、mElement、mSpecial、mResId;
公共卡(字符串元素、字符串颜色、int-ResourceId、int-CardNumber){
mResourceId=资源ID;
MCARDNAMBER=卡号;
熔化=元素;
mColor=颜色;
}
公共卡(字符串元素、字符串颜色、字符串资源ID、整数卡号){
mResId=资源id;
MCARDNAMBER=卡号;
熔化=元素;
mColor=颜色;
}
公共卡(字符串元素、字符串颜色、int-ResourceId、int-CardNumber、字符串特殊){
mResourceId=资源ID;
MCARDNAMBER=卡号;
熔化=元素;
mColor=颜色;
mSpecial=特殊;
}
受保护卡(包裹内){
mResourceId=in.readInt();
mCardNumber=in.readInt();
mColor=in.readString();
mResId=in.readString();
mElement=in.readString();
mSpecial=in.readString();
}
公共静态最终创建者=新创建者(){
@凌驾
公共卡createFromParcel(包裹中){
归还新卡(在中);
}
@凌驾
公共卡[]新阵列(整数大小){
退回新卡[尺寸];
}
};
公共对象getResourceId(){
如果(mResId==null){return mResourceId;}
else{return mResId;}
}
public int getResourceId(上下文){
试一试{
返回context.getResources().getIdentifier(mResId,“drawable”,context.getPackageName());
}捕获(例外e){
e、 printStackTrace();
返回0;
}
}
public void setResourceId(int ResourceId){this.mResourceId=ResourceId;}
public void setElement(String元素){this.mElement=Element;}
public void setCardNumber(int CardNumber){this.mCardNumber=CardNumber;}
public int getCardNumber(){
返回mCardNumber;
}
公共字符串getCardElement(){
回炉熔炼;
}
公共字符串getCardColor(){
返回mColor;
}
公共字符串getSpecial(){
返回mSpecial;
}
公共布尔值isPowerCard(){
布尔值isspecial=false;
如果(mSpecial==null){ispecial=false;}
else{isspecial=true;}
回报是特殊的;
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地写入(mResourceId);
目的写入(MCARDNAMBE);
目的地书面记录(mColor);
目的书面限制(合并);
目的地书面资本(特别);
}
}资源id是在应用程序更新时动态生成的。因此,在您的情况下,它是失败的 您可以尝试将资源的名称存储在共享首选项中,并使用该名称获取资源的id
Resources resources = getResources();
String resourceName = resources.getResourceEntryName(R.drawable.resource);
然后,您可以从共享首选项检索id
intresId = resources.getIdentifier(resourceName, "drawable", "your.package.name");
资源id是在应用程序更新时动态生成的。因此,在您的情况下,它是失败的 您可以尝试将资源的名称存储在共享首选项中,并使用该名称获取资源的id
Resources resources = getResources();
String resourceName = resources.getResourceEntryName(R.drawable.resource);
然后,您可以从共享首选项检索id
intresId = resources.getIdentifier(resourceName, "drawable", "your.package.name");
请注意
R。无论什么资源大部分都是在运行时生成的。我不确定你在问什么,但如果你想保存像图像这样的值,你必须将它们保存为blob,或者使用高效的存储解决方案(如Firebase)@Arthuratout What is blob?代表二进制长对象。基本上,您存储整个图片本身,如JPG或PNG。如果您保存R.drawable
值,它只是运行时引用资源的一个int。但它在上下文之外完全没有意义。请注意R.whatever
资源大多是在运行时生成的我不知道你在问什么,但如果你想保存像图像这样的值,你必须将它们保存为blob,或者使用高效的存储解决方案(比如Firebase)@Arthuratout什么是blob?代表二进制长对象。基本上,你存储整个图片本身,比如JPG或PNG。如果你保存R.drawable
值,它只是运行时引用资源的一个int。但是它在上下文之外完全没有意义,我确信字符串保存正确,但我需要更新de声明大约500张卡,因此这将是时间成本,我还需要在我的卡类中的方法getResourceId()处生成id,如何在非活动类中引用getResources?您需要活动上下文来调用方法getResourceId()。存储id是不可行且不可实现的,因为它们每次都是动态生成的。每次更新应用程序时,您都可以刷新共享首选项中的id。感谢它起作用,我刚刚传递了一个参数上下文,但我现在需要更改我制作的大约500张卡,我确信字符串保存正确,但我需要更新声明在大约500张卡中,这将是时间成本,我还需要在我的卡类中的方法getResourceId()处生成id,如何在非活动类中引用getResources?您需要活动上下文来调用方法getResourceId()。存储id是不可行且不可实现的,因为它们每次都是动态生成的。每次更新应用程序时,您都可以刷新共享首选项中的id。感谢它起作用,我刚刚传递了一个参数上下文,但我现在需要更改我制作的大约500张卡