2017-06-30 44 views
0

是否有可能做这样的事情:ConstraintLayout与数据绑定

XML:

 <android.support.constraint.Guideline 
      app:layout_constraintGuide_percent="@{viewModel.guidelinePercent}" 
     /> 

视图模型:

@Bindable 
    public float getGuidelinePercent() { 
     return condition ? 0.6f : 0.8f; 
    } 

我得到这个错误:

Cannot find the setter for attribute 'app:layout_constraintGuide_percent' with parameter type float on android.support.constraint.Guideline.

我有三ED与BindingAdaptor,但它不会改变的值:

视图模型:

@BindingAdapter(value = {"constraintPercent"}) 
public static void setConstraintPercent(Guideline view, float percent){ 
    ConstraintSet constraintSet = new ConstraintSet(); 
    constraintSet.setGuidelinePercent(view.getId(), percent); 
} 

XML:

<android.support.constraint.Guideline 
       app:constraintPercent="@{viewModel.guidelinePercent}" 
      /> 

有什么想法?
谢谢。

回答

1

此问题可能与Android Databinding cannot set the layout_width (layout_height) property有关。在任何情况下,下面的代码添加到ViewModel

public float getGuidelinePercent() { 
    return 0.5f; // Of course, this default could be anything you want. 
} 

@BindingAdapter("layout_constraintGuide_begin") 
public static void setLayoutConstraintGuideBegin(Guideline guideline, float percent) { 
    ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) guideline.getLayoutParams(); 
    params.guidePercent = percent; 
    guideline.setLayoutParams(params); 
} 

您的Guideline XML会是这个样子:

<android.support.constraint.Guideline 
     android:id="@+id/guideline" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     app:layout_constraintGuide_begin="@{viewModel.guidelinePercent}"/> 

顺便说一句,感谢这个想法。我一直想要一个更简单的方法来以编程方式调整准则。

+0

谢谢你的方式去改变指南LayoutParams。 Yup在Bindable的帮助下使用BindAdapter来提供参数值是一种强大的武器,也是使任何视图配置“databindable”的唯一方法。 :) – GuilhE

+0

@GuilhE我真的解决了setter错误,但我猜'LayoutParams'代码是一个奖金。 :) – Cheticamp

1

您创建的ConstraintSet应在设置百分位数后的某个时间设置为ConstraintLayout

@BindingAdapter(value = {"constraintPercent"}) 
public static void setConstraintPercent(Guideline view, float percent){ 
    ConstraintLayout constraintLayout = (ConstraintLayout) view.getParent(); 
    ConstraintSet constraintSet = new ConstraintSet(); 
    constraintSet.clone(constraintLayout); 
    constraintSet.setGuidelinePercent(view.getId(), percent); 
    constraintLayout.setConstraintSet(constraintSet); 
}