鉴于图像的来源 URL 可能存在也可能不存在,我如何在 Android 布局中使 ImageView 可选?

How do I make an ImageView optional in Android layout given that the source URL of the image may or may not exist?

在我的一个 Android 布局中,其中一个 ImageView 是 "optional",这意味着 src 并不总是 url。我正在遵循 MVVM 模式,如果有 URL,我想显示 ImageView,如果 URL 为空,则不显示它。

首先,我知道这可以使用两个独立的、几乎相同的布局资源文件来完成。但是我不想写那么多代码,特别是因为这两种布局之间的唯一区别是这个缩略图可能存在也可能不存在(为空)。

    <ImageView
        android:id="@+id/image_topic_creator_thumbnail"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:onClick="@{viewModel::getProfileOfCurrentTopicCreator}"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/text_topic_body"
        app:userThumbnailUrl="@{viewModel.currentTopic.creator.thumbnailUrl}" />

下面是来自 ViewModel 的代码:

    // circular image
@BindingAdapter({"userThumbnailUrl"})
public static void setUserThumbnailUrl(ImageView view, String url) {
    RequestOptions options = new RequestOptions()
            .circleCrop()
            .placeholder(R.drawable.user_thumbnail_placeholder)
            .error(R.drawable.user_thumbnail_placeholder)
            .priority(Priority.LOW);
    Glide.with(view.getContext())
            .load(url)
            .apply(options)
            .into(view);
}

在这种情况下,app:userThumbnailUrl 不能接受 null 或空字符串,因为这会导致 Glide 出错。我可以在 ViewModel 中实现逻辑来检查 url 是否为 null 或空,然后不使用 Glide,但是结果 return 是什么?当 url 为空时我什么都不做吗?这不会导致 ImageView 出错并导致应用程序崩溃吗?

像这样的东西应该可以工作:

        // circular image
@BindingAdapter({"userThumbnailUrl"})
public static void setUserThumbnailUrl(ImageView view, String url) {
    RequestOptions options = new RequestOptions()
            .circleCrop()
            .placeholder(R.drawable.user_thumbnail_placeholder)
            .error(R.drawable.user_thumbnail_placeholder)
            .priority(Priority.LOW);
    if(url != null && !url.isEmpty() ){ 
        Glide.with(view.getContext())
                .load(url)
                .apply(options)
                .into(view);
    } else{
        view.setVisibility(View.GONE);
    }
}

您的 ImageView 默认可见。让默认值不可见,然后在 url 存在时显示它。

  <ImageView
        android:id="@+id/image_topic_creator_thumbnail"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:visible="gone" //set invisible here here
        android:onClick="@{viewModel::getProfileOfCurrentTopicCreator}"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/text_topic_body"
        app:userThumbnailUrl="@{viewModel.currentTopic.creator.thumbnailUrl}" />




@BindingAdapter({"userThumbnailUrl"})
    public static void setUserThumbnailUrl(ImageView view, String url) {

        if (url != "") {
            RequestOptions options = new RequestOptions()
                .circleCrop()
                .placeholder(R.drawable.user_thumbnail_placeholder)
                .error(R.drawable.user_thumbnail_placeholder)
                .priority(Priority.LOW);
            Glide.with(view.getContext())
                .load(url)
                .apply(options)
                .into(view);
        }
    }