【问题标题】:How DataBindingComponents works on per-layout basis? [duplicate]DataBindingComponents 如何在每个布局的基础上工作? [复制]
【发布时间】:2016-11-07 08:07:07
【问题描述】:

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

从 IO16 视频中我知道也许我可以使用 DataBindingComponent 来实现此效果,就像 setImageUrl 示例一样,但我找不到任何示例代码关于 DataBindingComponents 和 BindingAdapter 注释的实例方法如何工作,谁能提供一些细节?

==2016-07-06 更新==

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

==2017-08-04 更新== 我不知道为什么这个问题被标记为重复,如果您了解 android 数据绑定,另一个问题就完全不同了。只是不知道如何去除重复标记,所以在这里进行编辑。

【问题讨论】:

    标签: android data-binding android-databinding


    【解决方案1】:

    再次观看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();
            }
        }
    }
    

    然后创建一个实现DataBindingComponent 的类,然后创建一个返回上述类实例的getter 方法。

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

    现在您可以创建该组件的任何实例并在绑定时使用它,例如在 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);
    }
    

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

    【讨论】:

    • 如何使用来自 Fragment @Marvin 的新 OptionBindingComponent()
    • @fɪəlɪs in Fragment#onCreate 使用 DataBindingUtil#setDefaultComponent
    • @fɪəlɪs OptionBindingComponent 旨在在布局膨胀时传递。所以你可以将它作为最后一个参数传递给 DataBindingUtil.inflate(inflater, layoutId, parent, attachToParent, bindingComponent)YourLayoutBinding.inflate(inflater, root, attachRoRoot, bindingComponent)
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多