qingmei2
3/20/2018 - 6:44 AM

Databindings

Android DataBinding工具类

/**
 * Config the view's binding event, for example, we want to prevent the view's repeat click event,
 * so we set just first click event is effective in specified times.
 * <p>
 * {@link #setClickListenerLockFirst(View, Runnable)}
 */
public class ViewBindingAdapter {

    @BindingAdapter({"onClickFirst", "android:clickable"})
    public static void setClickListener(View view, Runnable runnable, boolean clickable) {
        setClickListenerLockFirst(view, runnable);
        view.setClickable(clickable);
    }

    /**
     * Prevent users from repeating clicks event.
     * <p>
     * Example usage in xml:
     * <pre><code>
     *   app:onClickFirst="@{() -> component.doSomething()}
     * </code></pre>
     *
     * @param view
     * @param runnable
     * @see RxView#clicks(View)
     */
    @BindingAdapter({"onClickFirst"})
    public static void setClickListenerLockFirst(View view, Runnable runnable) {
        RxView.clicks(view)
                .throttleFirst(1000, TimeUnit.MILLISECONDS)
                .subscribe(v -> runnable.run());
    }

    /**
     * Configure whether the {@link View} is visible.
     * <p>
     * Example usage in xml:
     * <pre><code>
     *   app:visible="@{component.booleanFiled}
     * </code></pre>
     *
     * @param view
     * @param visible
     * @see View#setVisibility(int)
     */
    @BindingAdapter("visible")
    public static void setVisible(View view, boolean visible) {
        view.setVisibility(visible ? View.VISIBLE : View.GONE);
    }
}
public class EditTextBindingAdapter {

    /**
     * 设置是否可以获取焦点并编辑
     * @param view editView
     * @param editable 若为false,则EditText不可获取焦点并进行编辑
     */
    @BindingAdapter({"editable"})
    public static void setClickListener(EditText view, boolean editable) {
        view.setFocusable(editable);
        view.setFocusableInTouchMode(editable);
        if (editable)
            view.requestFocus();
    }
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
  
    <declare-styleable name="View">
        <attr name="visible" format="boolean" />
        <attr name="onClickFirst" format="reference" />
    </declare-styleable>
    
</resources>