DataBinding Android,自定义setter,不工作?

时间:2017-02-26 08:04:10

标签: android mvvm data-binding android-databinding

我有简单的布局和viewModel。我想将它们彼此连接但是它们没有连接。上述问题的问题是在日志中没有错误,我的应用程序也没有崩溃。

这是我的布局:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

<data>

    <variable
        name="progressView"
        type="uz.iutlab.ictnews.viewModel.ProgressViewModel" />

    <variable
        name="viewModel"
        type="uz.iutlab.ictnews.viewModel.DetailFragmentViewModel" />
</data>

<RelativeLayout
    android:id="@+id/activity_detail"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="uz.iutlab.ictnews.view.fragment.DetailFragment">

    <RelativeLayout
        android:id="@+id/fragment_detail_post_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/collapsing_image_height">

            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <com.makeramen.roundedimageview.RoundedImageView
                    android:id="@+id/fragment_detail_image_post"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:adjustViewBounds="true"
                    android:scaleType="centerCrop"
                    android:src="@{viewModel.image}"
                    app:layout_collapseMode="parallax"
                    app:setContext="@{viewModel.context}" />

                <android.support.v7.widget.Toolbar
                    android:id="@+id/fragment_detail_toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:layout_collapseMode="pin" />

                <TextView
                    android:id="@+id/fragment_detail_title_post"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:padding="@dimen/spacing_view_large"
                    android:text="@{viewModel.title}"
                    android:textColor="@android:color/white"
                    android:textSize="@dimen/font_size_title_huge" />
            </android.support.design.widget.CollapsingToolbarLayout>
        </android.support.design.widget.AppBarLayout>
    </RelativeLayout>
</RelativeLayout>

这是我的ViewModel类

public class DetailFragmentViewModel extends BaseObservable {

    private Post mPost;
    private Context mContext;

    public DetailFragmentViewModel(Post mPost,Context mContext) {
        this.mPost = mPost;
        this.mContext = mContext;
    }

    public String getTitle() {
        return mPost.getTitle().getRendered();
    }

    public Context getContext () {
        return mContext;
    }

    public String getImage() {
        if (mPost.getMedia().getSource_url() != null) {
            return mPost.getMedia().getSource_url();
        } else {
            return null;
        }
    }

    @BindingAdapter({"android:src","setContext"})
    public static void downloadImage (RoundedImageView imageView,String url,Context context) {
        if (url!=null) {
            Picasso.with(context).load(url).into(imageView);
        } else {
            imageView.setImageResource(R.drawable.placeholder);
        }
    }
}

没有错误,没有崩溃。应用程序正常工作,但没有任何标题,任何图像。我试过这个,而不是覆盖它自己编写的方法但不起作用。

@BindingAdapter({"bind:imageUrl","setContext"})
public static void downloadImage (RoundedImageView imageView,String url,Context context) {
    if (url!=null) {
        Picasso.with(context).load(url).into(imageView);
    } else {
        imageView.setImageResource(R.drawable.placeholder);
    }
}

除此之外。我也用debug检查它,上面的方法没有被调用。

3 个答案:

答案 0 :(得分:2)

您最好删除app:setContext="@{viewModel.context}"并从适配器的视图中获取它。您还需要使用没有命名空间的属性名称;因此,bind:imageUrl代替imageUrl仅使用@BindingAdapter("imageUrl") public static void downloadImage (RoundedImageView imageView, String url) { if (url != null) { Picasso.with(imageView.getContext()).load(url).into(imageView); } else { imageView.setImageResource(R.drawable.placeholder); } }

Picasso

但由于R.drawable.placeholder异步工作,您可能会在将图像再次设置为BindingAdapter后结束图像。

最后,您还可以查看生成的绑定java源代码,看看您的@media screen and (max-width: 799px) { } 是否在某处被调用。

答案 1 :(得分:0)

尝试这样:

<?php
$string = "Service, Service, Service, 8 mars, 2017, 22 mars, 2017, 5 april, 2017, 08:00, 08:00, 08:00";

    $pattern = '/(\d+) (\w+), (\d+)/i'; //remove comma before year
    $replacement = '${1} $2 $3';
    $fixed = preg_replace($pattern, $replacement, $string);

    $array = explode(', ', $fixed); 

    $i=0;

    foreach($array as $value) {
        echo $value.", ";
        $i++;

        if ($i == 3) {
            echo '<br>';
            $i = 0;
        }
    }

?>

答案 2 :(得分:0)

问题不在我的ViewModel或我的xml文件中,一切都是正确的,没有语法错误。问题在这里这是片段,我已将我的片段与我的viewModel连接在一起。我在这里创建绑定时犯了错误可以看到它。这是我的不工作

FragmentStudentLifeBinding binding = DataBindingUtil.inflate(inflater,R.layout.fragment_student_life,container,false);

这是正确的

FragmentStudentLifeBinding binding = DataBindingUtil.inflate(inflater,R.layout.fragment_student_life,container,true);

我错过了将片段附加到活动上,这就是为什么我的绑定没有工作21天。希望它对某人有帮助。