ViewBindingAdapter.java revision 716ba89e7f459f49ea85070d4710c1d79d715298
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package android.databinding.adapters; 17 18import android.annotation.TargetApi; 19import android.databinding.BindingAdapter; 20import android.databinding.BindingMethod; 21import android.databinding.BindingMethods; 22import android.os.Build; 23import android.os.Build.VERSION; 24import android.os.Build.VERSION_CODES; 25import android.view.View; 26import android.view.View.OnAttachStateChangeListener; 27import com.android.databinding.library.baseAdapters.R; 28 29@BindingMethods({ 30 @BindingMethod(type = View.class, attribute = "android:backgroundTint", method = "setBackgroundTintList"), 31 @BindingMethod(type = View.class, attribute = "android:fadeScrollbars", method = "setScrollbarFadingEnabled"), 32 @BindingMethod(type = View.class, attribute = "android:getOutline", method = "setOutlineProvider"), 33 @BindingMethod(type = View.class, attribute = "android:nextFocusForward", method = "setNextFocusForwardId"), 34 @BindingMethod(type = View.class, attribute = "android:nextFocusLeft", method = "setNextFocusLeftId"), 35 @BindingMethod(type = View.class, attribute = "android:nextFocusRight", method = "setNextFocusRightId"), 36 @BindingMethod(type = View.class, attribute = "android:nextFocusUp", method = "setNextFocusUpId"), 37 @BindingMethod(type = View.class, attribute = "android:nextFocusDown", method = "setNextFocusDownId"), 38 @BindingMethod(type = View.class, attribute = "android:requiresFadingEdge", method = "setVerticalFadingEdgeEnabled"), 39 @BindingMethod(type = View.class, attribute = "android:scrollbarDefaultDelayBeforeFade", method = "setScrollBarDefaultDelayBeforeFade"), 40 @BindingMethod(type = View.class, attribute = "android:scrollbarFadeDuration", method = "setScrollBarFadeDuration"), 41 @BindingMethod(type = View.class, attribute = "android:scrollbarSize", method = "setScrollBarSize"), 42 @BindingMethod(type = View.class, attribute = "android:scrollbarStyle", method = "setScrollBarStyle"), 43 @BindingMethod(type = View.class, attribute = "android:transformPivotX", method = "setPivotX"), 44 @BindingMethod(type = View.class, attribute = "android:transformPivotY", method = "setPivotY"), 45 @BindingMethod(type = View.class, attribute = "android:onDrag", method = "setOnDragListener"), 46 @BindingMethod(type = View.class, attribute = "android:onClick", method = "setOnClickListener"), 47 @BindingMethod(type = View.class, attribute = "android:onApplyWindowInsets", method = "setOnApplyWindowInsetsListener"), 48 @BindingMethod(type = View.class, attribute = "android:onCreateContextMenu", method = "setOnCreateContextMenuListener"), 49 @BindingMethod(type = View.class, attribute = "android:onFocusChange", method = "setOnFocusChangeListener"), 50 @BindingMethod(type = View.class, attribute = "android:onGenericMotion", method = "setOnGenericMotionListener"), 51 @BindingMethod(type = View.class, attribute = "android:onHover", method = "setOnHoverListener"), 52 @BindingMethod(type = View.class, attribute = "android:onKey", method = "setOnKeyListener"), 53 @BindingMethod(type = View.class, attribute = "android:onLongClick", method = "setOnLongClickListener"), 54 @BindingMethod(type = View.class, attribute = "android:onSystemUiVisibilityChange", method = "setOnSystemUiVisibilityChangeListener"), 55 @BindingMethod(type = View.class, attribute = "android:onTouch", method = "setOnTouchListener"), 56}) 57public class ViewBindingAdapter { 58 public static int FADING_EDGE_NONE = 0; 59 public static int FADING_EDGE_HORIZONTAL = 1; 60 public static int FADING_EDGE_VERTICAL = 2; 61 62 @BindingAdapter({"android:padding"}) 63 public static void setPadding(View view, int padding) { 64 view.setPadding(padding, padding, padding, padding); 65 } 66 67 @BindingAdapter({"android:paddingBottom"}) 68 public static void setPaddingBottom(View view, int padding) { 69 view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), 70 padding); 71 } 72 73 @BindingAdapter({"android:paddingEnd"}) 74 public static void setPaddingEnd(View view, int padding) { 75 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 76 view.setPaddingRelative(view.getPaddingStart(), view.getPaddingTop(), padding, 77 view.getPaddingBottom()); 78 } else { 79 view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), padding, 80 view.getPaddingBottom()); 81 } 82 } 83 84 @BindingAdapter({"android:paddingLeft"}) 85 public static void setPaddingLeft(View view, int padding) { 86 view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), 87 view.getPaddingBottom()); 88 } 89 90 @BindingAdapter({"android:paddingRight"}) 91 public static void setPaddingRight(View view, int padding) { 92 view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), padding, 93 view.getPaddingBottom()); 94 } 95 96 @BindingAdapter({"android:paddingStart"}) 97 public static void setPaddingStart(View view, int padding) { 98 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 99 view.setPaddingRelative(padding, view.getPaddingTop(), view.getPaddingEnd(), 100 view.getPaddingBottom()); 101 } else { 102 view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), 103 view.getPaddingBottom()); 104 } 105 } 106 107 @BindingAdapter({"android:paddingTop"}) 108 public static void setPaddingTop(View view, int padding) { 109 view.setPadding(view.getPaddingLeft(), padding, view.getPaddingRight(), 110 view.getPaddingBottom()); 111 } 112 113 @BindingAdapter({"android:requiresFadingEdge"}) 114 public static void setRequiresFadingEdge(View view, int value) { 115 final boolean vertical = (value & FADING_EDGE_VERTICAL) != 0; 116 final boolean horizontal = (value & FADING_EDGE_HORIZONTAL) != 0; 117 view.setVerticalFadingEdgeEnabled(vertical); 118 view.setHorizontalFadingEdgeEnabled(horizontal); 119 } 120 121 @BindingAdapter({"android:onClickListener", "android:clickable"}) 122 public static void setClickListener(View view, View.OnClickListener clickListener, 123 boolean clickable) { 124 view.setOnClickListener(clickListener); 125 view.setClickable(clickable); 126 } 127 128 @BindingAdapter({"android:onClick", "android:clickable"}) 129 public static void setOnClick(View view, View.OnClickListener clickListener, 130 boolean clickable) { 131 view.setOnClickListener(clickListener); 132 view.setClickable(clickable); 133 } 134 135 @BindingAdapter({"android:onLongClickListener", "android:longClickable"}) 136 public static void setListener(View view, View.OnLongClickListener clickListener, 137 boolean clickable) { 138 view.setOnLongClickListener(clickListener); 139 view.setLongClickable(clickable); 140 } 141 142 @BindingAdapter({"android:onLongClick", "android:longClickable"}) 143 public static void setOnLongClick(View view, View.OnLongClickListener clickListener, 144 boolean clickable) { 145 view.setOnLongClickListener(clickListener); 146 view.setLongClickable(clickable); 147 } 148 149 @BindingAdapter("android:onViewAttachedToWindow") 150 public static void setListener(View view, OnViewAttachedToWindow attached) { 151 setListener(view, null, attached); 152 } 153 154 @BindingAdapter("android:onViewDetachedFromWindow") 155 public static void setListener(View view, OnViewDetachedFromWindow detached) { 156 setListener(view, detached, null); 157 } 158 159 @BindingAdapter({"android:onViewDetachedFromWindow", "android:onViewAttachedToWindow"}) 160 public static void setListener(View view, final OnViewDetachedFromWindow detach, 161 final OnViewAttachedToWindow attach) { 162 if (VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1) { 163 final OnAttachStateChangeListener newListener; 164 if (detach == null && attach == null) { 165 newListener = null; 166 } else { 167 newListener = new OnAttachStateChangeListener() { 168 @Override 169 public void onViewAttachedToWindow(View v) { 170 if (attach != null) { 171 attach.onViewAttachedToWindow(v); 172 } 173 } 174 175 @Override 176 public void onViewDetachedFromWindow(View v) { 177 if (detach != null) { 178 detach.onViewDetachedFromWindow(v); 179 } 180 } 181 }; 182 } 183 final OnAttachStateChangeListener oldListener = ListenerUtil.trackListener(view, 184 newListener, R.id.onAttachStateChangeListener); 185 if (oldListener != null) { 186 view.removeOnAttachStateChangeListener(oldListener); 187 } 188 if (newListener != null) { 189 view.addOnAttachStateChangeListener(newListener); 190 } 191 } 192 } 193 194 @BindingAdapter("android:onLayoutChange") 195 public static void setOnLayoutChangeListener(View view, View.OnLayoutChangeListener oldValue, 196 View.OnLayoutChangeListener newValue) { 197 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 198 if (oldValue != null) { 199 view.removeOnLayoutChangeListener(oldValue); 200 } 201 if (newValue != null) { 202 view.addOnLayoutChangeListener(newValue); 203 } 204 } 205 } 206 207 @TargetApi(VERSION_CODES.HONEYCOMB_MR1) 208 public interface OnViewDetachedFromWindow { 209 void onViewDetachedFromWindow(View v); 210 } 211 212 @TargetApi(VERSION_CODES.HONEYCOMB_MR1) 213 public interface OnViewAttachedToWindow { 214 void onViewAttachedToWindow(View v); 215 } 216} 217