Merge "TextView setText/append methods set movement method"

This commit is contained in:
Siyamed Sinir
2015-11-18 18:32:22 +00:00
committed by Android (Google) Code Review
2 changed files with 57 additions and 28 deletions

View File

@@ -3366,10 +3366,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
/**
* Sets whether the movement method will automatically be set to
* {@link LinkMovementMethod} if {@link #setAutoLinkMask} has been
* set to nonzero and links are detected in {@link #setText}.
* The default is true.
* Sets whether the movement method will automatically be set to {@link LinkMovementMethod}
* after {@link #setText} or {@link #append} is called. The movement method is set if one of the
* following is true:
* <ul>
* <li>{@link #setAutoLinkMask} has been set to nonzero and links are detected in
* {@link #setText} or {@link #append}.
* <li>The input for {@link #setText} or {@link #append} contains a {@link ClickableSpan}.
* </ul>
*
* <p>This function does not have an immediate effect, movement method will be set only after a
* call to {@link #setText} or {@link #append}. The default is true.</p>
*
* @attr ref android.R.styleable#TextView_linksClickable
*/
@@ -3379,10 +3386,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
/**
* Returns whether the movement method will automatically be set to
* {@link LinkMovementMethod} if {@link #setAutoLinkMask} has been
* set to nonzero and links are detected in {@link #setText}.
* The default is true.
* Returns whether the movement method will automatically be set to {@link LinkMovementMethod}
* after {@link #setText} or {@link #append} is called.
*
* See {@link #setLinksClickable} for details.
*
* <p>The default is true.</p>
*
* @see #setLinksClickable
*
* @attr ref android.R.styleable#TextView_linksClickable
*/
@@ -3976,13 +3987,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
((Editable) mText).append(text, start, end);
boolean hasClickableSpans = false;
if (mAutoLinkMask != 0) {
boolean linksWereAdded = Linkify.addLinks((Spannable) mText, mAutoLinkMask);
// Do not change the movement method for text that support text selection as it
// would prevent an arbitrary cursor displacement.
if (linksWereAdded && mLinksClickable && !textCanBeSelected()) {
setMovementMethod(LinkMovementMethod.getInstance());
}
hasClickableSpans = Linkify.addLinks((Spannable) mText, mAutoLinkMask);
} else if (mLinksClickable && text instanceof Spanned) {
ClickableSpan[] clickableSpans =
((Spanned) text).getSpans(0, text.length(), ClickableSpan.class);
hasClickableSpans = clickableSpans != null && clickableSpans.length > 0;
}
// Do not change the movement method for text that supports text selection as it
// would prevent an arbitrary cursor displacement.
if (hasClickableSpans && mLinksClickable && !textCanBeSelected()) {
setMovementMethod(LinkMovementMethod.getInstance());
}
}
@@ -4327,6 +4344,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
text = TextUtils.stringOrSpannedString(text);
}
boolean hasClickableSpans = false;
if (mAutoLinkMask != 0) {
Spannable s2;
@@ -4336,22 +4354,32 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
s2 = mSpannableFactory.newSpannable(text);
}
if (Linkify.addLinks(s2, mAutoLinkMask)) {
hasClickableSpans = Linkify.addLinks(s2, mAutoLinkMask);
if (hasClickableSpans) {
text = s2;
type = (type == BufferType.EDITABLE) ? BufferType.EDITABLE : BufferType.SPANNABLE;
}
} else if (mLinksClickable && text instanceof Spanned) {
ClickableSpan[] clickableSpans =
((Spanned) text).getSpans(0, text.length(), ClickableSpan.class);
hasClickableSpans = clickableSpans != null && clickableSpans.length > 0;
if (hasClickableSpans && !(text instanceof Spannable)) {
text = mSpannableFactory.newSpannable(text);
}
}
/*
* We must go ahead and set the text before changing the
* movement method, because setMovementMethod() may call
* setText() again to try to upgrade the buffer type.
*/
mText = text;
if (hasClickableSpans) {
type = (type == BufferType.EDITABLE) ? BufferType.EDITABLE : BufferType.SPANNABLE;
/*
* We must go ahead and set the text before changing the
* movement method, because setMovementMethod() may call
* setText() again to try to upgrade the buffer type.
*/
mText = text;
// Do not change the movement method for text that support text selection as it
// would prevent an arbitrary cursor displacement.
if (mLinksClickable && !textCanBeSelected()) {
setMovementMethod(LinkMovementMethod.getInstance());
}
// Do not change the movement method for text that supports text selection as it
// would prevent an arbitrary cursor displacement.
if (mLinksClickable && !textCanBeSelected()) {
setMovementMethod(LinkMovementMethod.getInstance());
}
}

View File

@@ -4248,7 +4248,8 @@ i
<attr name="autoLink" />
<!-- If set to false, keeps the movement method from being set
to the link movement method even if autoLink causes links
to be found. -->
to be found or the input text contains a
{@link android.text.style.ClickableSpan ClickableSpan}. -->
<attr name="linksClickable" format="boolean" />
<!-- If set, specifies that this TextView has a numeric input method.
The default is false.