Android数据绑定,如何在drawable中绑定数据?

时间:2017-03-08 09:47:56

标签: android mvvm data-binding drawable android-databinding

我有这个drawable用于自定义进度条:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
    <shape>
        <solid android:color="@color/marm_color_blue_palette_light_primary"></solid>
    </shape>
</item>
<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <solid android:color="@color/marm_color_blue_palette_accent"></solid>
        </shape>
    </clip>
</item>
<item android:id="@android:id/progress">
    <clip>
        <shape>
            <solid android:color="@color/marm_color_blue_palette_accent"></solid>
        </shape>
    </clip>
</item>
</layer-list>

如何使用DataBinding设置这些颜色?我是Android数据绑定的新手,我来自Windows Phone MVVM。

我知道,对于活动布局,您必须这样做:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <import type="com.androidadvance.androidsurvey.R" />
    <variable
        name="dynamicUI"  type="com.example.DynamicConfigModel" />
</data>

<LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@{dynamicUI.mainBg, default=@color/color_palette_light_divider_text_12}"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@{dynamicUI.darkPrimary , default=@color/marm_color_blue_palette_dark_primary}"
        android:titleTextColor="@{dynamicUI.textLight, default=@android:color/white}"
        />

</LinearLayout>
</layout>

和java

ContentLayoutBinding binding = DataBindingUtil.setContentView(this, R.layout.YOURLAYOUT);
        binding.setDynamicUI(YOURMODEL);

一般情况下如何以可绘制或风格进行操作?

2 个答案:

答案 0 :(得分:0)

因为数据绑定基本上是在编译时生成的代码,所以目前仅针对布局而设计。如果尝试在可绘制,样式或菜单中使用它,则它将不起作用。

我知道很不幸,架构不完整,但是您会注意到,只要在布局文件周围添加布局标签,它就会生成一个NameOfActivityBinding类,在其中为您编写所有样板代码来管理元素的更改。因此,在我们看来,xml似乎指向一个变量,而Android仍在为您编写所有样板。

除了我们仍然可以看到它处于早期阶段的事实之外,它与其他框架没有什么不同。

您可以在自定义控件中创建一些属性更改的处理程序,然后利用自定义控件菜单或其他自定义类替换您将可绘制对象分配给的类。然后,自定义类可以利用绑定,但是这就打开了更多的工作,而仅仅是更改代码中的可绘制内容。

我要做的一件事是监视相应项目上的事件,然后像这样更改可绘制对象的色彩。

   @JvmStatic
@BindingAdapter("backgroundDrawableChange")
fun backgroundDrawableChange(view: RelativeLayout, isSelected: Boolean){
    var bgDrawable: LayerDrawable = view.background as LayerDrawable
    var shape: GradientDrawable =  bgDrawable.findDrawableByLayerId(R.id.shapeId) as GradientDrawable
    shape.setColor(Color.parseColor((if (isSelected) YACustomPreference.getInstance(view.context).getPrimaryColorHex() else YACustomPreference.getInstance(view.context).getWhite())))
}

然后将其附加到要监视更改的属性上。

      <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:orientation="horizontal"
            tools:visibility="gone"
            android:background="@drawable/rounded_bottom_right_button"
            app:backgroundDrawableChange="@{drawerItemModel.isSelected}"
            android:visibility="@{drawerItemModel.useRightAlignText ? View.VISIBLE : View.GONE}"
            android:gravity="center" />

这是一个简单的行单击监视器,具有用户定义的颜色,并且显然不可能将颜色绑定到可绘制对象中,因此这是下一个最好的方法。希望有帮助。

我知道这并不完全是您追求的目标,但是可能至少使您走上正确的道路或给您一个主意。

答案 1 :(得分:0)

几天前,我遇到了使用数据绑定设置可绘制的问题,然后我发现用这种方法,它很简单,而且很完美,而且很容易在BindingUtils.class中创建此方法。

public final class BindingUtils {
    private BindingUtils() {
    }
    @BindingAdapter({"progressDrawable"})
        public static void setProgressDrawable(ProgressBar progressBar, int resource) {
            if (resource != -1)
                progressBar.setProgressDrawable(ContextCompat.getDrawable(progressBar.getContext(),resource));
        }
    }

在XML中的用法:

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

    <data>

        <import type="android.view.View" />

        <import type="android.text.TextUtils" />

        <variable
            name="viewModel"
            type="com.home.NewViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="20dp"
        android:alpha="0.80"
        android:clickable="true"
        android:focusable="true"
        android:gravity="center">

        <ProgressBar
            android:id="@+id/progressBar"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:progress="@{viewModel.uploadProgress}"
            progressDrawable="@{viewModel.progressBg}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

ViewModel:

public class NewViewModel extends ViewModel{
    public final static short INIT_PROGRESS = 0;
    public final ObservableInt uploadProgress = new ObservableInt(INIT_PROGRESS);
    public final ObservableInt progressBg = new ObservableInt(R.drawable.bg_post_uploading_style); 
}