在我的应用程序中,一个活动包含厨房,可以在SD卡创建的文件夹(saved_images)中按顺序存储所有图像,每个东西都运行正常,但以便删除此文件夹( saved_images)由于任何原因,然后再次打开应用程序并保存任何图像,应用程序将再次创建(saved_images)文件夹,但保存的图像编号仍然记住SharedPreferences值并存储图像继续编号。以前保存的已删除旧文件夹的图像,我的目标是获得以下内容:
1 - 一次(saved_images)文件夹从SD卡中删除自动SharedPreferences必须清除,如果再次创建(saved_images)文件夹,则会从头开始存储图像,即image-1,image-2,等等。
我尝试使用此代码清除SharedPreferences但它不起作用可能导致存储一个仅称为image-1的图像。
2 - 如果我一次保存两次相同的图像,但我只需要保存一次,当我再次尝试保存它时必须给Toast:已经保存。
这是我用来清除和恢复SharedPreferences的代码片段:
View vi=convertView;
final ViewHolder holder;
if(convertView==null){
vi = inflater.inflate(R.layout.gallery_items, null);
holder=new ViewHolder();
holder.text=(TextView)vi.findViewById(R.id.textView1);
holder.image=(ImageView)vi.findViewById(R.id.image);
holder.button=(Button)vi.findViewById(R.id.button_save);
holder.button.setOnClickListener(new OnClickListener() {
private Bitmap bm;
public void onClick(View arg0) {
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/saved_images");
if(!myDir.exists()){
myDir.mkdirs();
bm = BitmapFactory.decodeResource( mContext.getResources(), images[itemPos]);
holder.image.setImageBitmap(bm);
SharedPreferences savedNumber = mContext.getSharedPreferences(PREFS_NAME, 0);
int lastSavedNumber = savedNumber.getInt("lastsavednumber",0);
lastSavedNumber++;
String fname = "Image-"+lastSavedNumber+".png";
File file = new File (myDir, fname);
if (file.exists ()) {file.delete (); }
try {
FileOutputStream out = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close(); }
catch (Exception e) {
e.printStackTrace(); }
SharedPreferences saveNumber = mContext.getApplicationContext
().getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editorset = saveNumber.edit();
editorset.putInt("lastsavednumber",lastSavedNumber);
editorset.commit();}
else if(!myDir.delete()){
SharedPreferences saveNumber1 = mContext.getApplicationContext
().getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = saveNumber1.edit();
editor.clear();
editor.commit();
Toast.makeText(mContext, "saved", Toast.LENGTH_SHORT). show();}}});
vi.setTag(holder);}
else holder=(ViewHolder)vi.getTag();
holder.text.setText(name[itemPos]);
final int stub_id=images[itemPos];
holder.image.setImageResource(stub_id);
return vi; }
这是原始代码,可以正常工作并按顺序存储所有图像
在SD卡文件夹中。
View vi=convertView;
final ViewHolder holder;
if(convertView==null){
vi = inflater.inflate(R.layout.gallery_items, null);
holder=new ViewHolder();
holder.text=(TextView)vi.findViewById(R.id.textView1);
holder.image=(ImageView)vi.findViewById(R.id.image);
holder.button=(Button)vi.findViewById(R.id.button_save);
holder.button.setOnClickListener(new OnClickListener() {
private Bitmap bm;
private String PREFS_NAME;
public void onClick(View arg0) {
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/saved_images");
if(!myDir.exists()){
myDir.mkdirs();}
bm = BitmapFactory.decodeResource( mContext.getResources(), images[itemPos]);
holder.image.setImageBitmap(bm);
SharedPreferences savedNumber = mContext.getSharedPreferences(PREFS_NAME, 0);
int lastSavedNumber = savedNumber.getInt("lastsavednumber",0);
lastSavedNumber++;
String fname = "Image-"+lastSavedNumber+".png";
File file = new File (myDir, fname);
if (file.exists ()) {file.delete (); }
try {
FileOutputStream out = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close(); }
catch (Exception e) {
e.printStackTrace();
}
SharedPreferences saveNumber = mContext.getApplicationContext
().getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editorset = saveNumber.edit();
editorset.putInt("lastsavednumber",lastSavedNumber);
editorset.commit();
Toast.makeText(mContext, "saved", Toast.LENGTH_SHORT). show();}});
vi.setTag(holder);}
else holder=(ViewHolder)vi.getTag();
holder.text.setText(name[itemPos]);
final int stub_id=images[itemPos];
holder.image.setImageResource(stub_id);
return vi; }
我知道有些东西缺失或以错误的方式应用,所以请任何帮助,我们将不胜感激,谢谢。
答案 0 :(得分:1)
问题1
删除文件夹时,必须将SharedPreferences值设置为零。因此它可以与您当前的代码一起使用,就像您预期的那样
if(!myDir.exists()){
myDir.mkdirs();
SharedPreferences saveNumber = mContext.getApplicationContext().getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editorset = saveNumber.edit();
editorset.putInt("lastsavednumber",0);
editorset.commit();
}
问题2 为包含已保存/未保存状态的图像的所有详细信息创建数据库。
不是将值存储在数组中,而是必须将其存储到数据库中。
在将图像保存到SD卡之前,您必须检查数据库已保存/未保存状态。如果未保存,则可以保存图像,并且还必须更新仅为该图像保存的数据库列状态。因此,下次当用户按下相同的图像时,您会发现图像已保存。您可以Toast
在图片已保存的位置。
答案 1 :(得分:0)
在您的原始代码中,您可以
...
int lastSavedNumber = savedNumber.getInt("lastsavednumber",0);
...
if(!myDir.exists())
{
myDir.mkdirs();
lastSavedNumber = 0; // reset counter
}
...