2015-04-23 10 views
5

Ich erstelle eine Android-Anwendung.Wählen Sie Bild aus der Galerie mit einer Schaltfläche und abrufen in ImageView. Der Bildabruf ist erfolgreich. Jetzt möchte ich den Zustand des ausgewählten Image gespeichert.Ich versuche zu beheben.Es macht Crash-Anwendung.Wenn ich die horizontale Ausrichtung ändern, ist die App abgestürzt.Bitte helfen Sie mir, das Problem zu lösen.Wie erstellt SavedInstanceState für dynamisch ausgewählte Bild in Android?

Mein Code:

public class MainActivity extends ActionBarActivity { 

ImageView imgBackground; 
Button loadImgBtn; 

String imgDecodableString; 
Drawable drawable; 

private static int RESULT_LOAD_IMG = 1; 
private static final String IMAGE_DATA = "image_resource"; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    loadImgBtn = (Button)findViewById(R.id.btnSelectImage); 
    imgBackground = (ImageView)findViewById(R.id.myImg); 


    loadImgBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      /* Create intent to open Image Application like Gallery */ 
      Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      /* start the Intent */ 
      startActivityForResult(galleryIntent,RESULT_LOAD_IMG); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    try { 
     if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) { 
      /* Get the Image from Data */ 
      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

      /* Get the Cursor */ 
      Cursor cursor = getContentResolver().query(selectedImage,filePathColumn,null,null,null); 

      /* Move the first row */ 
      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      imgDecodableString = cursor.getString(columnIndex); 
      cursor.close(); 

      /* Rendering the Image */ 
      drawable = new BitmapDrawable(imgDecodableString); 
      imgBackground.setBackgroundDrawable(drawable); 
     } 
    } catch (Exception e) { 
     message(getBaseContext()," Error : " + e.getMessage(),Toast.LENGTH_SHORT); 
    } 
} 

public void message(Context ctx,String msg,int duration) { 
    Toast.makeText(ctx,msg,duration).show(); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putParcelable(IMAGE_DATA, (android.os.Parcelable) drawable); 
} 

@Override 
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    drawable = (Drawable) savedInstanceState.getParcelable(IMAGE_DATA); 
} 
} 
+1

Suche implementiert http://stackoverflow.com/questions/11346275/android-why- is-using-onsaveinsancestate-zu-speichern-ein-bitmap-objekt-nicht-ist-ca –

+0

@BojanKseneman bro können Sie meinen Code umschreiben .. – reegan29

+1

Ich tat, aber ich weiß nicht, ob es funktioniert, habe ich nicht getestet es –

Antwort

1

ich nicht getestet haben, so dass ich weiß nicht, ob es funktioniert. Hoffe es ist.

Aber Sie sollten dieses

bewusst sein ... es nicht möglich sein könnte für Sie vollständig mit dem Bundle Ihre Aktivitätszustand wiederherzustellen, dass das System für Sie spart mit dem onSaveInstanceState() Rückruf -Es ist nicht entworfen, um große Objekte (wie Bitmaps) zu tragen und die darin enthaltenen Daten müssen serialisiert dann deserialized, die viel Speicherplatz verbrauchen und die Konfigurationsänderung langsam machen können. In einer solchen Situation können Sie die Last der Neuinitialisierung Ihrer Aktivität mindern, indem Sie das statusbehaftete Objekt beibehalten, wenn Ihre Aktivität aufgrund einer Konfigurationsänderung neu gestartet wird.

public class MainActivity extends ActionBarActivity { 

     ImageView imgBackground; 
     Button loadImgBtn; 

     String imgDecodableString; 
     BitmapDrawable drawable; 

     private static int RESULT_LOAD_IMG = 1; 
     private static final String IMAGE_DATA = "image_resource"; 


     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      loadImgBtn = (Button)findViewById(R.id.btnSelectImage); 
      imgBackground = (ImageView)findViewById(R.id.myImg); 


      loadImgBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
      /* Create intent to open Image Application like Gallery */ 
        Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      /* start the Intent */ 
        startActivityForResult(galleryIntent,RESULT_LOAD_IMG); 
       } 
      }); 

      if(savedInstanceState != null) { 
       Bitmap tmp = savedInstanceState.getParcelable(IMAGE_DATA); 
       if(tmp != null) { 
        drawable = new BitmapDrawable(getResources(), tmp); 
        imgBackground.setImageDrawable(drawable); 
       } 
      } 
     } 

     @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      try { 
       if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) { 
      /* Get the Image from Data */ 
        Uri selectedImage = data.getData(); 
        String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

      /* Get the Cursor */ 
        Cursor cursor = getContentResolver().query(selectedImage,filePathColumn,null,null,null); 

      /* Move the first row */ 
        cursor.moveToFirst(); 

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
        imgDecodableString = cursor.getString(columnIndex); 
        cursor.close(); 

      /* Rendering the Image */ 
        drawable = new BitmapDrawable(imgDecodableString); 
        imgBackground.setBackgroundDrawable(drawable); 
       } 
      } catch (Exception e) { 
       message(getBaseContext()," Error : " + e.getMessage(), Toast.LENGTH_SHORT); 
      } 
     } 

     public void message(Context ctx,String msg,int duration) { 
      Toast.makeText(ctx,msg,duration).show(); 
     } 

     @Override 
     protected void onSaveInstanceState(Bundle outState) { 
      super.onSaveInstanceState(outState); 
      if(drawable != null && drawable.getBitmap() != null) { 
       outState.putParcelable(IMAGE_DATA, drawable.getBitmap()); 
      } 
     } 

     @Override 
     protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { 
      super.onRestoreInstanceState(savedInstanceState); 
     } 
    } 

} 
+0

Dank bro warten Sie einen Moment ich antworte Ihnen .... – reegan29

+0

Wow Vielen Dank Bro. Es funktioniert ... Gott segne dich. – reegan29

+0

Ich bin froh, das zu hören. Prost –

1

Seien Sie sich mit der Instanz Staat mit Bitmaps vorsichtig. Wie Bojan zitiert, sollten Sie das über 'onSaveInstanceState' verwaltete Bundle nicht für Bilder verwenden.

Dies ist das aktualisierte Zitat:

es nicht möglich sein könnte für Sie vollständig mit dem Bundle Ihren Aktivitätszustand wiederherzustellen, dass das System mit dem onSaveInstanceState für Dich speichert() Callback-es nicht ausgelegt ist, Tragen Sie große Objekte (z. B. Bitmaps), und die darin enthaltenen Daten müssen serialisiert und anschließend deserialisiert werden. Dies kann viel Speicher belegen und die Konfigurationsänderung verlangsamen. In einer solchen Situation können Sie die Belastung der Neuinitialisierung Ihrer Aktivität verringern, indem Sie ein Fragment beibehalten, wenn Ihre Aktivität aufgrund einer Konfigurationsänderung neu gestartet wird. Dieses Fragment kann Verweise auf statusbehaftete Objekte enthalten, die Sie beibehalten möchten.

vom official documentation

Sie den Code finden kann ich nach diesem Hinweis auf meine Antwort auf diese anderen question