【问题标题】:Setting MenuItem icon from URL - Android从 URL 设置 MenuItem 图标 - Android
【发布时间】:2016-01-07 15:33:26
【问题描述】:

我想在我的 ActionBar 中设置一个 MenuItem,它会指向我应用中的用户个人资料页面。我希望那个图标是他的个人资料图片,我有 URL 并且可以从中创建位图。

图像未存储在我的项目文件夹或本地任何地方,因此我无法从 R.drawable 中获取它。

有人可以帮助我将使用 URL 创建的位图设置为 MenuItem 图标吗​​?感谢您的帮助!

【问题讨论】:

标签: android android-actionbar menuitem


【解决方案1】:

您可以执行以下操作从位图中设置图标:

myMenuItem.setIcon(new BitmapDrawable(getResources(), myBitmap));

在您的代码中,这看起来有点像这样:

public boolean onCreateOptionsMenu( Menu menu ) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate( R.menu.actionbar, menu );
    userItem = menu.findItem(R.id.userItem);

    Bitmap myBitmap = //get your bitmap
    userItem.setIcon(new BitmapDrawable(getResources(), myBitmap));

    return menu;
}

您需要先从 URL 获取文件并将其转换为 Bitmap。请注意,这会很慢,因为如果您在启动应用程序时执行此操作,则用户必须等到文件下载后才能显示应用程序。如果您的图标不经常更改,我建议将其缓存在设备上并重复使用本地存储的副本。

同时检查“在运行时更改菜单”部分here

【讨论】:

  • 嘿,非常感谢!让我试试这个,我会告诉你的
【解决方案2】:

Kotlin - 毕加索解决方案

扩展功能

fun com.squareup.picasso.Target.picassoLoad(url: String, resources: Resources): com.squareup.picasso.Target {
    Picasso.get().load(url)
            .resize(resources.getDimension(R.dimen.menuIconSize).toInt(),
                    resources.getDimension(R.dimen.menuIconSize).toInt())
            .into(this)
    return this
}

在您的活动中(请注意,您需要对目标保持强有力的参考才能工作)

private var target : com.squareup.picasso.Target? = null

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.basemenu, menu)

    menu.findItem(R.id.menu_you_want)?.let { menuItem ->

        target = object : com.squareup.picasso.Target {
            override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
                menuItem.setIcon(R.drawable.fallback_image)
            }

            override fun onBitmapFailed(e: java.lang.Exception?, errorDrawable: Drawable?) {
                menuItem.setIcon(R.drawable.fallback_image)
            }

            override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
                menuItem.icon = BitmapDrawable(resources, CircleTransform.getCroppedBitmap(bitmap!!))
            }

        }.picassoLoad(url, resources)
    }

    return super.onCreateOptionsMenu(menu)
}

和circletransform类

class CircleTransform : Transformation {
    private var x: Int = 0
    private var y: Int = 0

    override fun transform(source: Bitmap): Bitmap {
        val size = Math.min(source.width, source.height)

        x = (source.width - size) / 2
        y = (source.height - size) / 2

        val squaredBitmap = Bitmap.createBitmap(source, x, y, size, size)
        if (squaredBitmap !== source) source.recycle()
        val bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)

        val canvas = Canvas(bitmap)
        val paint = Paint()
        val shader = BitmapShader(squaredBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
        paint.shader = shader
        paint.isAntiAlias = true

        val r = size / 2f
        canvas.drawCircle(r, r, r, paint)

        squaredBitmap.recycle()
        return bitmap
    }


    override fun key() = "circle(x=$x,y=$y)"

    companion object {
        fun getCroppedBitmap(bitmap: Bitmap): Bitmap {
            val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
            val canvas = Canvas(output)

            val color = -0xbdbdbe
            val paint = Paint()
            val rect = Rect(0, 0, bitmap.width, bitmap.height)

            paint.isAntiAlias = true
            canvas.drawARGB(0, 0, 0, 0)
            paint.color = color
            canvas.drawCircle(bitmap.width / 2f, bitmap.height / 2f,
                    bitmap.width / 2f, paint)
            paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
            canvas.drawBitmap(bitmap, rect, rect, paint)
            return output
        }
    }
}

【讨论】:

    【解决方案3】:

    我也在搜索这个,最近我从另一个 stackoverflow 答案中找到了它,我给了 reference link 这个是针对 JAVA 的,我在下面添加 Kotlin 代码。

    这里是 kotlin 代码的代码: imageUser 是字符串格式的图片的Url。 您应该添加自己的图片网址。

    Glide.with(this).asBitmap().load(imageUser)
                        .into(object : SimpleTarget<Bitmap?>(150, 100) {
                            override fun onResourceReady(
                                resource: Bitmap,
                                transition: Transition<in Bitmap?>?
                            ) {
                                yourItemIcon.setIcon(BitmapDrawable(resources, resource))
                            }
                        })
    

    在里面设置你的项目如下。 onCreateOptionsMenu

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        val yourItemIcon  = menu!!.findItem(R.id.ic_topic_info)     
      return true
    

    }

    对于新用户: 您还应该将这些代码行添加到 dependencies 应用级别的 build.gradle 中,以便在您的应用中添加 Glide 库。

    implementation 'com.github.bumptech.glide:glide:4.12.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
    

    【讨论】:

    • 解决方案对我有用,但 Glide 中的 SimpleTarget 已弃用。使用CustomTarget
    • 完全正确,SimpleTarget 应该被替换。
    猜你喜欢
    • 2015-11-04
    • 2014-11-09
    • 1970-01-01
    • 2016-03-02
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多