底部导航视图自定义项图像。

5
我想将用户已登录时的自定义图片设置为 BottomNavigationView 中 "Profile" 项的图像。我有用户图像的 URL。
这是建议的设计: enter image description here

1
请查看此链接:http://joerichard.net/android/android-how-to-load-navigationview-menu-item-icon-from-url-using-picasso/ - Kartik Shandilya
你是否已经找到了解决方案? - AJay
@AJay,还没有。 - Amr Barakat
这个有运气了吗? - Jovan
6个回答

4
我使用了以下的代码来使其正常工作。(Kotlin)
导航栏是 BottomNavigationView。
val menu = navigation.menu
val menuItem = menu.findItem(R.id.my_account)
Glide.with(this)
        .asBitmap()
        .load("https://my_account_image_url")
        .apply(RequestOptions
                .circleCropTransform()
                .placeholder(R.drawable.ic_avatar))
        .into(object : SimpleTarget<Bitmap>() {
            override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                menuItem?.icon = BitmapDrawable(resources, resource)
            }
        })

我不知道 Glide 出了什么问题,但它显示的是黑色图像,就好像它是一个没有颜色的图标一样,这并没有帮助。 - Asylzat

2
你可以这样做:
BottomNavigationView navigation;

然后在您的onCreate方法中:

    navigation = findViewById(R.id.navigation);
    Menu a = navigation.getMenu();
    MenuItem b = a.findItem(R.id.profile_menu);
    if(userloggedIn){
        b.setIcon(R.drawable.icons_logged_in);
    }
    else{
        b.setIcon(R.drawable.icon_logged_out);
    }

如果您想从URL加载图片,您可以使用Glide或Picasso。

1
从AppCompat 1.1.0开始,您还需要删除此内容的色彩。
val menu = navigation.menu
val menuItem = menu.findItem(R.id.profile_menu_item)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        menuItem?.iconTintList = null
        menuItem?.iconTintMode = null
}

Glide.with(this)
        .asBitmap()
        .load("url")
        .apply(RequestOptions
                .circleCropTransform()
                .placeholder(R.drawable.placeholder))
        .into(object : CustomTarget<Bitmap>(24.toPixel(), 24.toPixel()) {
            override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                menuItem?.icon = BitmapDrawable(resources, resource)
            }

            override fun onLoadCleared(placeholder: Drawable?) {}
        })

@Jovan 是的,上面的解决方案在版本低于 O 的情况下也能够工作。 - Rishabh876
在低于O版本的系统中,我们只能得到圆圈而不是在xml中设置的色调颜色的图像。我正在使用iconTint颜色的选择器。如果您有几分钟,请查看我的问题:https://stackoverflow.com/questions/58285700/bottomnavigationview-set-custom-icon-downloaded-from-some-url - Jovan

0

0

您可以使用Glide在底部导航视图中设置个人资料图片。在设置个人资料图片之前,您需要将图像加载为位图。然后,将位图转换为Drawable类型以设置项目图标。

以下是操作步骤。

首先,在应用程序级别的build.gradle文件中调用

implementation 'com.github.bumptech.glide:glide:4.9.0'

然后点击立即同步

之后,在包含您的BottomNavigationView的活动中,您可以像这样做一些事情。

Glide.with(getApplicationContext()).asBitmap().load(*yourImageUrl*)
.into(new CustomTarget<Bitmap>() {

  @Override
  public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
    Drawable profileImage = new BitmapDrawable(getResources(), resource);
    bottomNavigationView.getMenu().getItem(*yourItemIndex*).setIcon(profileImage);
  }

  @Override
  public void onLoadCleared(@Nullable Drawable placeholder) {

  }
}

如果你想将个人资料图片变成圆形,你可以使用 .circleCrop() 或者 .optionalCircleCrop()。不过,我认为使用 .optionalCircleCrop 更好。


-1

目前,还没有找到适当的解决方案,但是你可以做类似于这样的事情。对我有效。

  ..........
   <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">


    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_menu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        app:elevation="0dp"
        app:itemBackground="@color/bottomMenuColor"
        app:itemHorizontalTranslationEnabled="false"
        app:itemTextAppearanceActive="@style/BottomNavigationView"
        app:itemTextAppearanceInactive="@style/BottomNavigationView"
        app:labelVisibilityMode="unlabeled"
        app:menu="@menu/main_menu" />

    <ImageView
        android:id="@+id/imgView"
        android:layout_width="@dimen/scale_30dp"
        android:layout_height="@dimen/scale_30dp"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="@dimen/scale_40dp"
        android:src="@drawable/temp_person" />
</RelativeLayout>
 .......

哇,太棒了,:D - Prashant Jajal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接