DataBindingComponents如何基于每个布局工作?

Mar*_*vin 1 data-binding android android-databinding

Android DataBinding库是我学习MVVM的迷人库。现在存在一个问题,即如何在基于布局的基础上将文本更新到UI之前播放动画。(不是BindingAdapter使用静态绑定适配器的全局布局的解决方案。)

从IO16视频中,我知道也许可以DataBindingComponentsetImageUrl示例一样使用它来实现这种效果,但是我找不到关于DataBindingComponents和BindingAdapter注释实例方法的工作方式的示例代码,有人可以提供有关此细节的信息吗?

== 更新2016-07-06 ==

我知道我可以使用带有自定义标签的静态绑定适配器,但这不是我想要的。

== 更新2017-08-04 ==我不知道为什么这个问题被标记为重复,如果您知道android数据绑定,则另一个问题完全不同。只是不知道如何删除重复标记,因此请在此处进行编辑。

Mar*_*vin 5

再次观看io16会话后,我终于找到了解决方案:

首先,创建一个类,该类的任何方法都带有标记为BindingAdapter

public class OptionBindingAdapter {
    private boolean mOptionsShowing;

    @BindingAdapter("android:text")
    public void setOption(TextView button, String text) {
        if (text == null) {
            return;
        }

        if (button.getTranslationY() > 0) {
            button.setText(text);
            button.setVisibility(View.VISIBLE);
            button.animate()
                    .translationY(0)
                    .start();
        } else {
            button.animate()
                    .translationY(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, button.getResources().getDisplayMetrics()))
                    .start();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个实现的类,DataBindingComponent您只需在其中创建一个getter方法即可,该方法返回上述类的实例。

public class OptionBindingComponent implements DataBindingComponent {
    private OptionBindingAdapter mOptionBindingAdapter = new OptionBindingAdapter();

    public OptionBindingAdapter getOptionBindingAdapter() {
        return mOptionBindingAdapter;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以创建此组件的任何实例,并在绑定时使用它,例如在Activity#onCreate中。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mBinding  = DataBindingUtil.setContentView(this, R.layout.activity_main, new OptionBindingComponent());
    mViewModel = new OptionsViewModel(new OptionsRepository(), this);
    mBinding.setVariable(me.zhanghailin.androiddatabindingwithanimations.BR.options, mViewModel);
}
Run Code Online (Sandbox Code Playgroud)

做完了!就是这样,结果是绑定适配器将用于此绑定,而不是默认组件。