下面列出了android.text.Selection#setSelection ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public void doneEditingFolderName(boolean commit) {
mFolderName.setHint(sHintText);
// Convert to a string here to ensure that no other state associated with the text field
// gets saved.
String newTitle = mFolderName.getText().toString();
if (!SettingsProvider.getBoolean(mLauncher,
SettingsProvider.SETTINGS_UI_HOMESCREEN_HIDE_ICON_LABELS,
R.bool.preferences_interface_homescreen_hide_icon_labels_default)) {
mInfo.setTitle(newTitle);
}
LauncherModel.updateItemInDatabase(mLauncher, mInfo);
if (commit) {
sendCustomAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED,
String.format(getContext().getString(R.string.folder_renamed), newTitle));
}
// In order to clear the focus from the text field, we set the focus on ourself. This
// ensures that every time the field is clicked, focus is gained, giving reliable behavior.
requestFocus();
Selection.setSelection((Spannable) mFolderName.getText(), 0, 0);
mIsEditingName = false;
}
public void run() {
Spannable buf = mBuffer;
if (buf != null) {
int st = Selection.getSelectionStart(buf);
int en = Selection.getSelectionEnd(buf);
int start = buf.getSpanStart(TextKeyListener.ACTIVE);
int end = buf.getSpanEnd(TextKeyListener.ACTIVE);
if (st == start && en == end) {
Selection.setSelection(buf, Selection.getSelectionEnd(buf));
}
buf.removeSpan(Timeout.this);
}
}
public void undo() {
EditItem edit = editHistory.getPrevious();
if (edit == null) {
return;
}
Editable text = textView.getEditableText();
int start = edit.start;
int end = start + (edit.after != null ? edit.after.length() : 0);
isUndoOrRedo = true;
text.replace(start, end, edit.before);
isUndoOrRedo = false;
removeUnderlineSpans(text);
Selection.setSelection(text, edit.before == null ? start
: (start + edit.before.length()));
}
private void formatPhoneNumberInput(final Editable input) {
final int selection = Selection.getSelectionStart(buffer);
boolean selectionPositionRemembered = false;
asYouTypeFormatter.clear();
String phoneNumberText = "";
int offset = 0;
final int length = input.length();
while (offset < length) {
final int codePoint = Character.codePointAt(input, offset);
if (Character.isDigit(codePoint)) {
final char digit = CodePoint.toDigitChar(codePoint);
selectionPositionRemembered = selectionPositionRemembered || offset >= selection;
phoneNumberText = asYouTypeFormatter.inputDigit(digit, !selectionPositionRemembered);
}
offset += Character.charCount(codePoint);
}
input.replace(0, input.length(), phoneNumberText);
if (selection != -1) {
Selection.setSelection(input,
selectionPositionRemembered ? asYouTypeFormatter.getRememberedPosition() : phoneNumberText.length());
}
}
private static void startSelection(TextView textView, int start, int end) {
final CharSequence text = textView.getText();
if (SUPPORTED && start >= 0 && end > start && textView.isTextSelectable() && text instanceof Spannable) {
final Spannable spannable = (Spannable) text;
start = Math.min(start, spannable.length());
end = Math.min(end, spannable.length());
Selection.setSelection(spannable, start, end);
try {
final Object editor = FIELD_EDITOR != null ? FIELD_EDITOR.get(textView) : textView;
METHOD_START_SELECTION.invoke(editor);
} catch (Exception e) {
}
}
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String content = etResume.getText().toString().trim();
if (content.length() > 50) {
String newStr = content.substring(0, 50);
etResume.setText(newStr);
Selection.setSelection(etResume.getText(), 50);
content = newStr;
ToastUtils.show(getString(R.string.resume_change_num_max));
}
tvNum.setText("" + content.length());
}
@Override
public void onRestoreInstanceState(Parcelable state) {
if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
SavedState savedState = (SavedState) state;
mMode = savedState.mMode;
mPlaceholder = savedState.mPlaceholder;
mEmptyPlaceholder = savedState.mEmptyPlaceholder;
mMark = savedState.mMark;
mPlaceholders = savedState.mPlaceholders;
mHintText = savedState.mHintText;
mFormatStyle = savedState.mFormatStyle;
mShowHintWhileEmpty = savedState.mShowHintWhileEmpty;
mHintColor = savedState.mHintColor;
if (mMode == MODE_SIMPLE) {
parseSimplePlaceholders();
} else if (mMode == MODE_COMPLEX) {
parseComplexPlaceholders();
}
if (savedState.mRealText != null) {
mRestoring = true;
super.onRestoreInstanceState(savedState.getSuperState());
mRestoring = false;
mFilterRestoreTextChangeEvent = true;
setText(savedState.mRealText);
mFilterRestoreTextChangeEvent = false;
Editable text = getText();
Selection.setSelection(
text,
Math.min(savedState.mSelectionStart, text.length()),
Math.min(savedState.mSelectionEnd, text.length()));
} else {
super.onRestoreInstanceState(savedState.getSuperState());
}
}
@Override
public void onClick(View v) {
int position = (Integer)v.getTag();
if(position == 0)
removeSpan(mSelectedSpan);
else
replaceSpan(mSelectedSpan, (Recipient)mReplacementAdapter.getItem(position));
Selection.setSelection(getText(), getText().length());
dismissReplacementPopup();
}
@Override
@NonNull
public Editable newEditable(@NonNull CharSequence source) {
MentionsEditable text = new MentionsEditable(source);
Selection.setSelection(text, 0);
return text;
}
private void formatMask(@NonNull Editable value) {
InputFilter[] inputFilters = value.getFilters();
value.setFilters(new InputFilter[0]);
int indexInMask = 0;
int indexInText = 0;
int maskLength = 0;
int inputLength = 0;
boolean treatNextCharAsLiteral = false;
boolean maskIsNotNumeric = false;
Object selection = new Object();
value.setSpan(selection, Selection.getSelectionStart(value), Selection.getSelectionEnd(value), Spanned.SPAN_MARK_MARK);
while (indexInMask < mask.length()) {
char charInMask = mask.charAt(indexInMask);
if (!treatNextCharAsLiteral && isMaskChar(charInMask)) {
// Found mask character, try to parse text
maskIsNotNumeric |= charInMask != NUMBER_MASK;
if (indexInText >= value.length()) {
// Add trailing placeholders
value.insert(indexInText, placeholder);
value.setSpan(new PlaceholderSpan(), indexInText, indexInText + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
++indexInText;
++inputLength;
++maskLength;
++indexInMask;
} else if (!matchMask(charInMask, value.charAt(indexInText))) {
// Skip bad character in text
value.delete(indexInText, indexInText + 1);
} else {
// Character in text is acceptable, go to next character in mask
++indexInText;
++inputLength;
++maskLength;
++indexInMask;
}
} else if (!treatNextCharAsLiteral && charInMask == ESCAPE_CHAR) {
// Next character in mask must be escaped
treatNextCharAsLiteral = true;
++indexInMask;
} else {
// Found a literal or escaped character in mask
value.insert(indexInText, String.valueOf(charInMask));
value.setSpan(new LiteralSpan(), indexInText, indexInText + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
treatNextCharAsLiteral = false;
++indexInText;
++maskLength;
++indexInMask;
}
}
while (value.length() > maskLength) {
int pos = value.length() - 1;
value.delete(pos, pos + 1);
}
Selection.setSelection(value, value.getSpanStart(selection), value.getSpanEnd(selection));
value.removeSpan(selection);
value.setFilters(inputFilters);
int newInputType = inputLength > 0
? (maskIsNotNumeric
? InputType.TYPE_CLASS_TEXT
: InputType.TYPE_CLASS_NUMBER)
: 0;
if (getInputType() != newInputType)
setInputType(newInputType);
}
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer,
MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
onLinkClick(link[0]);
// URLSpan[] linkUrlSpan = buffer.getSpans(off, off, URLSpan.class);
// if (linkUrlSpan[0].getURL().toString().startsWith(urlStartWith)) {
//onLinkClick(linkUrlSpan[0].getURL());
// }else {
// link[0].onClick(widget);
// }
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer,
buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
}
return true;
} else {
Selection.removeSelection(buffer);
}
}
return super.onTouchEvent(widget, buffer, event);
}
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
LongClickableSpan[] link = buffer.getSpans(off, off, LongClickableSpan.class);
if (link.length != 0) {
long currTime = System.currentTimeMillis();
LongClickableSpan l = link[0];
int ls = buffer.getSpanStart(l);
int le = buffer.getSpanEnd(l);
// 判断点击的点是否在Image范围内
ClickableImageSpan[] is = buffer.getSpans(ls, le, ClickableImageSpan.class);
if (is.length > 0) {
if (!is[0].clicked(x)) {
Selection.removeSelection(buffer);
return false;
}
} else if (off < layout.getOffsetToLeftOf(ls) || off > layout.getOffsetToLeftOf(le + 1)) {
// 判断点击位置是否在链接范围内
Selection.removeSelection(buffer);
return false;
}
if (action == MotionEvent.ACTION_UP) {
// 如果按下时间超过500毫秒,触发长按事件
if (currTime - lastTime > MIN_INTERVAL) {
if (!l.onLongClick(widget)) {
// onLongClick返回false代表事件未处理,交由onClick处理
l.onClick(widget);
}
} else {
l.onClick(widget);
}
} else {
Selection.setSelection(buffer,
ls, le);
}
lastTime = currTime;
return true;
} else {
Selection.removeSelection(buffer);
return false;
}
}
return super.onTouchEvent(widget, buffer, event);
}
/**
* 设置输入框的光标到末尾
*/
public static void setEditTextSelectionToEnd(EditText editText) {
Editable editable = editText.getEditableText();
Selection.setSelection((Spannable) editable,
editable.toString().length());
}
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer,
MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
ClickableSpan[] links = buffer.getSpans(off, off, ClickableSpan.class);
if (links.length != 0) {
ClickableSpan link = links[0];
if (action == MotionEvent.ACTION_UP) {
if (link instanceof TextLinkSpan) {
((TextLinkSpan) link).onClick(
widget, TextLinkSpan.INVOCATION_METHOD_TOUCH);
} else {
link.onClick(widget);
}
} else if (action == MotionEvent.ACTION_DOWN) {
if (widget.getContext().getApplicationInfo().targetSdkVersion
>= Build.VERSION_CODES.P) {
// Selection change will reposition the toolbar. Hide it for a few ms for a
// smoother transition.
widget.hideFloatingToolbar(HIDE_FLOATING_TOOLBAR_DELAY_MS);
}
Selection.setSelection(buffer,
buffer.getSpanStart(link),
buffer.getSpanEnd(link));
}
return true;
} else {
Selection.removeSelection(buffer);
}
}
return super.onTouchEvent(widget, buffer, event);
}
public void setSelection(int index) {
Selection.setSelection(mTextStorage, index);
}
/**
* Convenience for {@link Selection#setSelection(Spannable, int, int)}.
*/
public void setSelection(int start, int stop) {
Selection.setSelection(getText(), start, stop);
}
@Override
public void clearTypedText() {
mDefaultKeySsb.clear();
mDefaultKeySsb.clearSpans();
Selection.setSelection(mDefaultKeySsb, 0);
}
@Override
public void initialize(TextView widget, Spannable text) {
// It will mark the IMM as openable
Selection.setSelection(text, 0);
}
/**
* This is why you don't implement your own TextView kids; you have to handle everything!
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!(text instanceof Spanned)) return super.onTouchEvent(event);
Spannable spannedText = (Spannable) text;
boolean handled = false;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
pressedSpan = getPressedSpan(spannedText, event);
if (pressedSpan != null) {
pressedSpan.setPressed(true);
Selection.setSelection(spannedText, spannedText.getSpanStart(pressedSpan),
spannedText.getSpanEnd(pressedSpan));
handled = true;
postInvalidateOnAnimation();
}
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
TouchableUrlSpan touchedSpan = getPressedSpan(spannedText, event);
if (pressedSpan != null && touchedSpan != pressedSpan) {
pressedSpan.setPressed(false);
pressedSpan = null;
Selection.removeSelection(spannedText);
postInvalidateOnAnimation();
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
if (pressedSpan != null) {
pressedSpan.setPressed(false);
pressedSpan.onClick(this);
handled = true;
postInvalidateOnAnimation();
}
pressedSpan = null;
Selection.removeSelection(spannedText);
} else {
if (pressedSpan != null) {
pressedSpan.setPressed(false);
handled = true;
postInvalidateOnAnimation();
}
pressedSpan = null;
Selection.removeSelection(spannedText);
}
return handled;
}
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(widget);
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer,
buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
}
if (widget instanceof TextViewFixTouchConsume) {
((TextViewFixTouchConsume) widget).mlinkHit = true;
}
return true;
} else {
Selection.removeSelection(buffer);
Touch.onTouchEvent(widget, buffer, event);
return false;
}
}
return Touch.onTouchEvent(widget, buffer, event);
}