0

在我的应用程序中,一个活动包含厨房,它可以将所有图像按顺序存储在 SD 卡创建的名为 (saved_images) 的文件夹中,一切运行正常,如果出于任何原因删除此文件夹 (saved_images),然后再次打开应用程序并保存任何图像,应用程序将再次创建 (saved_images) 文件夹,但保存的图像编号仍会记住 SharedPreferences 值并将图像存储在续编号中。以前保存的已删除旧文件夹的图像,我的目标是获得以下内容:

1-必须清除从 SD 卡中自动删除的 (saved_images) 文件夹 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; } 

我知道有些东西丢失或以错误的方式应用,所以请任何帮助,我们将不胜感激,谢谢。

4

2 回答 2

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 ,为图像的所有详细信息(包括已保存/未保存状态)创建一个数据库。

您不必将值存储在数组中,而是将其存储到数据库中。

在将图像保存到 sdcard 之前,您必须检查数据库的已保存/未保存状态。如果未保存,则您可以保存图像,并且您必须将数据库列状态更新为仅为该图像保存。所以下次当用户按下同一张图片时,你可以发现图片被保存了。您可以在哪里Toast保存图像。

于 2013-04-22T10:16:50.623 回答
0

在您的原始代码中,您可以

...
int lastSavedNumber = savedNumber.getInt("lastsavednumber",0);
...
if(!myDir.exists())
{
       myDir.mkdirs();
       lastSavedNumber = 0; // reset counter
}
...
于 2013-04-20T21:09:54.120 回答