2016-08-31 3 views
0

In meiner App kann der Benutzer ein Bild aus der Galerie auswählen und es in den Hintergrund einer RelativeLayout setzen. Aber das Bild wird in meiner onActivityResult() -Methode nie sofort auf den Hintergrund gesetzt, wenn ich die Bitmap des gewählten Bildes mit Picasso in meine Ansicht lade.setBackground() in onActivityResult wird nie aufgerufen

ist hier ein screenrecord Video des Problems: https://www.youtube.com/watch?v=jABnheTV0IU

Aber wenn diese Methode in meinem RecyclerView Adapter wird das Bild aufgerufen wird als Hintergrund für den RelativeLayout sofort eingestellt:

@Override 
    public void onClick(final View v) { 

     int position = getLayoutPosition(); 
     String path = PreferenceManager.getDefaultSharedPreferences(context).getString(App.IMAGE_URI,""); 

     /* 
     This put the current selected image from the gallery as background 
     */ 
     if (position == 0 && !path.isEmpty()) { 

      Picasso.with(context).load(path).centerCrop().resize(view.getWidth(), view.getHeight()).into(new Target() { 
       @Override 
       public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
        view.setBackground(new BitmapDrawable(bitmap)); 
       } 

       @Override 
       public void onBitmapFailed(Drawable errorDrawable) { 

       } 

       @Override 
       public void onPrepareLoad(Drawable placeHolderDrawable) { 

       } 
      }); 

die onActivityResult in Meine MainActivity-Klasse.

@Override 
protected void onActivityResult(int requestCode, int resultCode, final Intent data) { 


    if (resultCode == RESULT_OK && requestCode == 1 && data.getData() !=null) { 

     PreferenceManager.getDefaultSharedPreferences(this).edit().putString(App.IMAGE_URI, data.getData().toString()).apply(); 

     Picasso.with(this).load(data.getData()).centerCrop().resize(width, height).into(new Target() { 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 

      //this is never called or dosn't work 
      relativeLayout.setBackground(new BitmapDrawable(bitmap)); 


      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 

      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 

      } 
     }); 

    } 
} 
+0

Gerade hier unter (if (Result = = RESULT_OK && requestCode == 1 && data.getData()! = Null) {) add (Log.i ("Running", "Running");) und im Logcat Search-Typ (Running) - siehst du Running wenn du zurück zur Hauptaktivität gehst ?? Wenn das nicht der Fall ist, dann ist das falsch (if (resultCode == RESULT_OK && requestCode == 1 && data.getData()! = null) – Tasos

+0

@Tasos Ja "Running" erscheint im Logcat, wenn ich ein Bild aus Gallary wähle und es zurückgibt zurück – Muddz

+0

dann picasso in die Suche eingeben - alle Fehler ?? – Tasos

Antwort

1

Nach this Picasso hält nur einen schwachen Verweis auf das Target Objekt. Was bedeutet, dass Sie sich irgendwo darauf beziehen müssen. Machen Sie Target als MainActivity Klasse Memeber. So rufen aussehen wird geladen wie so:

//Create Target right before it's needed 
mTarget = new Target() {/*same as in your question*/}; 
Picasso.with(this).load(data.getData()).centerCrop().resize(width, height).into(mTarget); 

Oder könnten Sie folgende innere Klasse declarate

private static ViewTarget implement Target { 
    private View mView; 
    public ViewTarget(View view) { 
     mView = view; 
    } 

    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
     mView.setBackground(new BitmapDrawable(bitmap)); 
    } 
}; 

Und wie nutzen so:

mTarget = new ViewTarget(relativeLayout); 
Picasso.with(this).load(data.getData()).centerCrop().resize(width, height).into(mTarget); 
+0

Wie würde ich die Bitmap in meine RelativeLayout.setbackground (); – Muddz

+0

@Muddz Ich habe Antwort – j2ko

+0

aktualisiert Schön, dass es funktionierte! Könnten Sie mir ein gutes e xplanion warum funktioniert das und nicht das andere? – Muddz

Verwandte Themen