Загрузить значок пункта меню NavigationView с Picasso

ОБНОВЛЕНИЕ: я переключился на Glide, и теперь он работает

У меня есть NavigationView (Drawer) с программно созданными элементами меню. Можно ли загрузить для них иконки с Picasso? Я пробовал, но это не работает. Я попробовал это с помощью Target от Picasso.


person Community    schedule 15.11.2015    source источник
comment
Разместите соответствующий код в своем вопросе.   -  person Sufian    schedule 15.11.2015
comment
и объясните, что вы подразумеваете под «это не работает».   -  person Sufian    schedule 15.11.2015
comment
Что они МОГЛИ иметь в виду, так это то, что при использовании Picasso для загрузки изображения в поле изображения представления заголовка стандартного сгенерированного кода Android Studio с использованием библиотек дизайна NavigationView, если вы запускаете Picasso для извлечения изображения в onCreate действия, Picasso извлекает изображение и присваивает изображение изображению, но когда слайды открываются, оно больше не назначается. Не знаю, почему, я тоже пытаюсь определить проблему.   -  person Kenny    schedule 15.04.2016
comment
Выследил свою собственную проблему, возможно, это была их проблема. Я выделял цель в части конструктора запросов и не сохранял ссылку, и она была собрана мусором. Я держал ссылку, и все было хорошо.   -  person Kenny    schedule 15.04.2016


Ответы (2)


Мы должны получить «NavigationView» по идентификатору, а затем применить изображение «picasso», используя объект «NavigationView».

    NavigationView navView =(NavigationView)findViewById(R.id.nav_view);

    navView.setNavigationItemSelectedListener(this);
    ImageView header=(ImageView)navView.getHeaderView(0).findViewById(R.id.event_logo);
    Picasso.with(this).load( "https://d30y9cdsu7xlg0.cloudfront.net/png/17241-200.png").into(header);
person Yogesh Shinde    schedule 28.11.2016
comment
В последнем navView нет getHeaderView() - person Himani; 21.07.2021

Недавно я нашел способ сделать это с помощью Picasso на языке kotlin.


//Implemented Databinding in project so able to
//call views directly with the help of binding object
val menu: Menu = binding.navigationView.menu

//Picasso form com.squreup.picasso.Picasso
Picasso.get().load("""**SOURCE URL**""")
        .placeholder(R.drawable.<placeholder_name>)
        .into(object: Target{ //Target interface from com.squareup.picasso.Target 
            override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
                println("icon loaded $bitmap")
                menu[0].icon = BitmapDrawable(resources, bitmap)
            }
            override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {
                println("Loading failed... ${e?.message}")
            }
            override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
                println("Loading your icon...")
                menu[0].icon = placeHolderDrawable
            }
        })

Для java будет немного другой код


//Implemented Databinding in project so able to
//call views directly with the help of binding object
Menu menu = binding.navigationView.getMenu();

//Picasso form com.squreup.picasso.Picasso
Picasso.get().load("""**SOURCE URL**""")
        .placeholder(R.drawable.<placeholder_name>)
        .into(new Target(){ //Target interface from com.squareup.picasso.Target 
            @Override
            fun onBitmapLoaded(@Nullable Bitmap bitmap, @Nullable Picasso.LoadedFrom from) {
                System.out.println("icon loaded " + bitmap.toString())
                menu[0].setIcon(new BitmapDrawable(getResources(), bitmap))
            }
            @Override
            fun onBitmapFailed(@Nullable Exception e, @Nullable Drawable errorDrawable) {
                System.out.println("Loading failed... " + e.getMessage())
            }
            @Override
            fun onPrepareLoad(@nullable Drawable placeHolderDrawable) {
                System.out.println("Loading your icon...")
                menu[0].setIcon(placeHolderDrawable)
            }
        })

Примечание. Позаботьтесь о реализации зависимости Picasso в файле build.gradle на уровне приложения.

//latest_version is 2.71828 at the time of posting this answer
implementation 'com.squareup.picasso:picasso:$latest_version'
person Er Harsh Rathore    schedule 12.03.2021