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>