【问题标题】:Data binding adapter. How to get view by id reference?数据绑定适配器。如何通过 id 参考获取视图?
【发布时间】:2018-06-12 14:22:25
【问题描述】:

我想将视图引用指定为ImageView的属性

@BindingAdapter(value = {"imageUrl", "progressView"}, requireAll = false)
public static void setImageUrl(ImageView imageView, String url, @IdRes int progressBar) {
    Context context = imageView.getContext();
    View progressView  = imageView.getRootView().findViewById(progressBar);
     progressView.setVisibility(View.VISIBLE);

    Glide.with(context).load(url).listener(new RequestListener<String, GlideDrawable>() {
        @Override
        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
            if (progressView!= null) {
                 progressView.setVisibility.setVisibility(View.GONE);
            }
            return false;
        }

        @Override
        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
            if (progressView!= null) {
                 progressView.setVisibility(View.GONE);
            }
            return false;
        }
    }).crossFade().into(imageView);
}

但是我的进度视图是空的。 我尝试将上下文转换为活动,findViewById 也为空 另一种解决方案是在图像下方添加进度视图,当它成功加载时,它应该被覆盖 bt 图像

【问题讨论】:

    标签: android xml mvvm data-binding android-binding-adapter


    【解决方案1】:

    奇怪的是你看到一个空的progressView。您的布局中可能没有它?

    在任何情况下,您都可以这样做:

    <ProgressBar android:id="@+id/progressBarView" .../>
    <!-- other stuff -->
    <ImageView app:progressView="@{progressBarView}" app:imageUrl="..." .../>
    

    在您的 BindingAdapter 中:

    @BindingAdapter(value = {"imageUrl", "progressView"}, requireAll = false)
    public static void setImageUrl(ImageView imageView, String url, ProgressBar progressBar) {
        ...
    }
    

    【讨论】:

    • 这是一个很好的答案。我确实在将progress_bar_view 用作id 并尝试将其放入app:progressView 时遇到问题,但是当发生数据绑定时,id 会变成驼峰式。
    【解决方案2】:

    @BindingAdapter "value" 是一个字符串数组,所以试试这个:

    @BindingAdapter(value = {"imageUrl", "progressViewId"}, requireAll = false)
    public static void setImageUrl(ImageView imageView, String iamgeUrl, String progressViewStrId) {
         int progressBarId = Integer.valueOf(progressViewStrId);
         ...
    }
    

    【讨论】:

      【解决方案3】:

      在我的示例中,我将 ScrollView id 作为 BindingAdapter 的参数传递。

      这是布局代码:

      <LinearLayout
          android:orientation="horizontal"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          app:fadeVisible="@{viewModel.shippingMethodsVisible}"
          app:fadeScrollView="@{scrollView}">
      

      这是用 Kotlin 编写的 Bindig Adapters 代码:

      @JvmStatic @BindingAdapter(value = ["fadeVisible", "fadeScrollView"], requireAll = false)
      fun setFadeVisible(view: View, visible: Boolean, scrollView: ScrollView) {
      ...
      

      【讨论】:

        猜你喜欢
        • 2016-10-30
        • 1970-01-01
        • 2020-06-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多