2016-08-31 2 views
0

В моем приложении пользователь может выбрать изображение из галереи и установить его на фон RelativeLayout. Но изображение никогда не устанавливается сразу в фоновом режиме в моем методе onActivityResult(), как предполагалось, когда я загружаю растровое изображение выбранного изображения с помощью picasso в мое представление.setBackground() in onActivityResult никогда не называется

Вот screenrecord видео проблемы: https://www.youtube.com/watch?v=jABnheTV0IU

Но когда этот метод в моем RecyclerView адаптер называется изображение устанавливается в качестве фона к RelativeLayout сразу:

@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) { 

       } 
      }); 

onActivityResult в мой класс MainActivity.

@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

Только под здесь (если (ResultCode = = RESULT_OK && requestCode == 1 && data.getData()! = Null) {) add (Log.i («Запуск», «Выполнение»);) и в виде поиска в Logcat (Running) - вы видите Running когда вы возвращаетесь к основной деятельности? если вы не ошибаетесь (если (resultCode == RESULT_OK && requestCode == 1 && data.getData()! = null) – Tasos

+0

@Tasos Да «Запуск» появляется в логарифме, когда я выбираю изображение из галереи, и оно возвращается назад – Muddz

+0

затем введите picasso в поиск - любые ошибки – Tasos

ответ

1

this В соответствии с Пикассо сохраняет только слабую ссылку на объект Target. Это означает, что вам нужно где-то ссылаться на него. Сделать Target как MainActivity класс memeber. Так называют загрузки будет выглядеть так:

//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); 

Или вы можете 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)); 
    } 
}; 

И использовать его так:

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

Как загрузить Bitmap в мой RelativeLayout.setbackground (); – Muddz

+0

@ Muddz Я обновил ответ – j2ko

+0

Приятно было сработать! Не могли бы вы дать мне хороший e xplantion, почему это работает, а не другое? – Muddz

Смежные вопросы