summaryrefslogtreecommitdiff
path: root/extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java')
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java61
1 files changed, 53 insertions, 8 deletions
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java
index 41ae1520..2d3bebb4 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java
@@ -15,14 +15,21 @@
*/
package android.databinding.adapters;
+import com.android.databinding.library.baseAdapters.R;
+
import android.databinding.BindingAdapter;
import android.databinding.BindingMethod;
import android.databinding.BindingMethods;
+import android.databinding.InverseBindingAdapter;
+import android.databinding.InverseBindingListener;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
+import android.text.Spanned;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
import android.text.TextWatcher;
import android.text.method.DialerKeyListener;
import android.text.method.DigitsKeyListener;
@@ -33,8 +40,6 @@ import android.util.Log;
import android.util.TypedValue;
import android.widget.TextView;
-import com.android.databinding.library.baseAdapters.R;
-
@BindingMethods({
@BindingMethod(type = TextView.class, attribute = "android:autoLink", method = "setAutoLinkMask"),
@BindingMethod(type = TextView.class, attribute = "android:drawablePadding", method = "setCompoundDrawablePadding"),
@@ -50,13 +55,31 @@ import com.android.databinding.library.baseAdapters.R;
public class TextViewBindingAdapter {
private static final String TAG = "TextViewBindingAdapters";
-
public static final int INTEGER = 0x01;
-
public static final int SIGNED = 0x03;
-
public static final int DECIMAL = 0x05;
+ @BindingAdapter("android:text")
+ public static void setText(TextView view, CharSequence text) {
+ final CharSequence oldText = view.getText();
+ if (text == oldText || (text == null && oldText.length() == 0)) {
+ return;
+ }
+ if (text instanceof Spanned) {
+ if (text.equals(oldText)) {
+ return; // No change in the spans, so don't set anything.
+ }
+ } else if (!haveContentsChanged(text, oldText)) {
+ return; // No content changes, so don't set anything.
+ }
+ view.setText(text);
+ }
+
+ @InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged")
+ public static String getTextString(TextView view) {
+ return view.getText().toString();
+ }
+
@BindingAdapter({"android:autoText"})
public static void setAutoText(TextView view, boolean autoText) {
KeyListener listener = view.getKeyListener();
@@ -300,12 +323,31 @@ public class TextViewBindingAdapter {
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
}
+ private static boolean haveContentsChanged(CharSequence str1, CharSequence str2) {
+ if ((str1 == null) != (str2 == null)) {
+ return true;
+ } else if (str1 == null) {
+ return false;
+ }
+ final int length = str1.length();
+ if (length != str2.length()) {
+ return true;
+ }
+ for (int i = 0; i < length; i++) {
+ if (str1.charAt(i) != str2.charAt(i)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
@BindingAdapter(value = {"android:beforeTextChanged", "android:onTextChanged",
- "android:afterTextChanged"}, requireAll = false)
+ "android:afterTextChanged", "android:textAttrChanged"}, requireAll = false)
public static void setTextWatcher(TextView view, final BeforeTextChanged before,
- final OnTextChanged on, final AfterTextChanged after) {
+ final OnTextChanged on, final AfterTextChanged after,
+ final InverseBindingListener textAttrChanged) {
final TextWatcher newValue;
- if (before == null && after == null && on == null) {
+ if (before == null && after == null && on == null && textAttrChanged == null) {
newValue = null;
} else {
newValue = new TextWatcher() {
@@ -321,6 +363,9 @@ public class TextViewBindingAdapter {
if (on != null) {
on.onTextChanged(s, start, before, count);
}
+ if (textAttrChanged != null) {
+ textAttrChanged.onChange();
+ }
}
@Override