2014-10-14 10 views
5

Nella mia applicazione voglio selezionare l'immagine da Gallery e impostare l'immagine in ListView. Nel mio ListView I have 16 rows. So when ever item click in ListView open the gallery and set the image to ListView . But my problem is some times after startActivityForResult() , oncreate() `metodo chiamato. Questo è il codice onclickPerché il metodo oncreate viene chiamato dopo startActivityForResult?

Intent intent = new Intent(
          Intent.ACTION_PICK, 
          android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
        intent.setType("image/*"); 
        startActivityForResult(
          Intent.createChooser(intent, "Select File"), 
          SELECT_PICTURE); 

E questo è il onActivityResult

public void onActivityResult(int requestcode, int resultcode, Intent data) { 
    Log.e("result", "result"); 
    displayMetrics = this.getResources().getDisplayMetrics(); 
    Ew = displayMetrics.widthPixels; 
    Eh = displayMetrics.heightPixels; 

    switch (requestcode) { 
    case SELECT_PICTURE: 
     if (resultcode == RESULT_OK) { 

      lelListLayout.setVisibility(View.GONE); 
      relImageLayout.setVisibility(View.VISIBLE); 


      Uri selectedImageUri = data.getData(); 
      selectedImagePath = getPath(selectedImageUri); 

      ExifInterface exif = null; 
      // Bitmap bmRotated = null; 

      try { 
       exif = new ExifInterface(selectedImagePath); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      int orientation = exif.getAttributeInt(
        ExifInterface.TAG_ORIENTATION, 
        ExifInterface.ORIENTATION_UNDEFINED); 
      Log.e("Orientation==>", "" + orientation); 

      try { 

       bmRotated = null; 
       bmGallayImage = null; 
       trimCache(); 
       bmGallayImage = convertBitmap(selectedImagePath); 
       bmRotated = InventorySubmitImagesActivity.rotateBitmap(
         bmGallayImage, orientation); 

       // if(bmRotated.getWidth()>bmRotated.getHeight()){ 
       if (bmRotated.getWidth() > 1024) { 
        float x = 0; 
        x = 1024/(float) bmRotated.getWidth(); 
        // Log.e("x====","value "+x); 

        bmRotated = Bitmap.createScaledBitmap(bmRotated, 1024, 
          (int) (bmRotated.getHeight() * x), true); 
       } 
       /* 
       * }else{ if(bmRotated.getHeight() > 1024){ float x=0; 
       * x=1024/(float)bmRotated.getHeight(); 
       * Log.e("x====","value "+x); 
       * 
       * bmRotated = Bitmap.createScaledBitmap(bmRotated, 
       * (int)(bmRotated.getWidth()*x), 1024, true); } } 
       */ 


       Eh = Eh - ll_buttonlayout.getHeight(); 


       float iw = bmRotated.getWidth(); 
       float ih = bmRotated.getHeight(); 



       float diff = Ew/iw; 

       float layoutwidth = Ew; 
       float layoutheight = diff * ih; 

       if (layoutheight > Eh) { 

        diff = Eh/ih; 
        layoutwidth = Ew * diff; 
        layoutheight = Eh; 
       } 

       bmGallayImage = bmRotated; 
       if (bmRotated != null) { 

        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
          (int) layoutwidth, (int) layoutheight); 
        relImage.setLayoutParams(layoutParams); 


        Drawable dr = new BitmapDrawable(bmRotated); 
        old_width = bmRotated.getWidth(); 
        old_height = bmRotated.getHeight(); 

        relImage.setBackgroundDrawable(dr); 

       } 
       left = (int) layoutwidth/2 - 34; 
       top = (int) layoutheight/2 - 8; 

      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      // drag_check=true; 
      relImage.removeAllViews(); 

      imgMarker = new ImageView(this); 
      final RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.MATCH_PARENT, 
        RelativeLayout.LayoutParams.MATCH_PARENT); 
      relImage.addView(imgMarker, layoutParams); 
      imgMarker.setScaleType(ImageView.ScaleType.MATRIX); 
      bmdragImage = BitmapFactory.decodeResource(getResources(), 
        R.drawable.image_marker); 
      imgMarker.setImageBitmap(bmdragImage); 

      matrix = new Matrix(); 
      savedMatrix = new Matrix(); 
      oldDist = 0f; 
      start = new PointF(); 
      mid = new PointF(); 

      matrix.postTranslate(left, top); 
      imgMarker.setImageMatrix(matrix); 

      imgMarker.setOnTouchListener(RefurbishmentImageActivity.this); 
      imgMarker.setVisibility(View.VISIBLE); 

      // end.. 
      // } 

     } 
     break; 

}}

In questo ListView dopo aver selezionato 6 o 7 immagini onCreate metodo chiamato, prima della onactivityresult(). Ma dopo il metodo oncreate() viene chiamato nuovamente il risultato di avvio. Per favore guidami qual è il problema. Grazie InAdvance a tutti ..

risposta

7

prima della onActivityResult(). Ma dopo OnCreate() Metodo risultato di nuovo startActivity chiamato

quando l'attività viene inviato a sfondo (quando altre attività diventa su di esso, o quando viene inviato dal tasto home per sfondo) la sua istanza è tenuto in vita come finché il sistema non è sotto pressione di memoria. quando il sistema non ha abbastanza memoria per fare qualsiasi cosa stia facendo attualmente in foreground, di solito rivendicherà la memoria interrompendola e rilasciandola dalle attività in background della memoria.

in questo caso: il sistema fornisce il callback Activity.onSaveInstanceState che verrà richiamato dall'attività che verrà uccisa per fornire la possibilità di salvare qualsiasi stato necessario per il salvataggio prima di essere ucciso.

quando l'attività tornerà in primo piano - sarà ricreato (è per questo che onCreate() chiamato di nuovo), con il parametro savedInstanceState che non sarà nullo.

the savedInstanceState contiene bundle con tutti gli extra forniti nel callback onSavedInstanceState().

questo è molto importante da capire.

per una migliore comprensione, vi consiglio di leggere seriamente - http://developer.android.com/training/basics/activity-lifecycle/recreating.html

+0

Sono uno sviluppatore esperto e tuttavia non ho mai pensato a questo problema con startActivityForResult. Ma quando ho avuto il problema era così ovvio. – Warpzit

+0

Sono contento che ti abbia aiutato .. –

0

La finestra di dialogo con il selettore di selezione è troppo grande per il sistema e riduce la memoria memorizzando la cache dell'applicazione. Controllare è il metodo onSaveInstanceState chiamato prima dello onCreate. Se sì, allora è possibile salvare i dati necessari in bundle e caricarlo in onCreate metodo

+0

è questo problema di memoria o qualsiasi altro problema? – rams

+0

questo può essere causato dal selettore di immagini - lo si avvia 6-7 volte, assegna molta memoria e quindi il sistema deve chiamare lo strumento di pulizia della memoria –

+0

il modo migliore per risolvere questo problema è implementare il meccanismo saveInstanceState, perché non si può toccare chooser - l'utente può utilizzare un altro cattivo –