把一个List
输出成a,b,c
这种形式,我们项目里面提供了一个这样的工具类:
public static String getString(List list) {
if (CollectionsWrapper.isEmpty(list)) return null;
StringBuilder sb = new StringBuilder();
int size = list.size();
for (int i = 0; i < size; i++) {
sb.append(list.get(i));
if (i != size - 1) {
sb.append(",");
}
}
return sb.toString();
}
方法肯定是多种多样的,但是Android SDK
在TextUtils
里面就有提供了一个方法join
,可以达到效果。
平常我开发用TextUtils
中最多的方法分别是isEmpty
和equals
。其他方法了解并不多,或者不了解,下面我们开始介绍一下TextUtils
中的方法(注:方法重载只介绍一种,隐藏和私有方法没有介绍):
Demo 地址:传送门
private String mWords1 = "这句话很长很长,真的很长很长,长的不得了,长的不要不要的,长...长长...chang...chang................";
private String mWords2 = "Andy, Bob, Charles, David, Andy, Bob, Charles, David, Andy, Bob, Charles, David, Andy, Bob, Charles, David, Andy, Bob, Charles, David";
//把“很长”设置为红色背景
mSpanny1 = new Spanny(mWords1).findAndSpan("很长", new Spanny.GetSpan() {
@Override
public Object getSpan() {
return new BackgroundColorSpan(Color.RED);
}
});
//把“Bob”设置为红色背景
mSpanny2 = new Spanny(mWords2).findAndSpan("Bob", new Spanny.GetSpan() {
@Override
public Object getSpan() {
return new BackgroundColorSpan(Color.GREEN);
}
});
public static CharSequence commaEllipsize(CharSequence text,
TextPaint p, float avail,
String oneMore,
String more)
例如Andy, Bob, Charles, David
这样的句子,修改为能够在一行avail
宽度显示。发回结果例如
Andy, Bob, 1 more
或Andy, Bob, 2 more
。
注意:more 中的数字要有%d
来format,来显示不同的数字。text
中必须用英文逗号分隔。
例子:
CharSequence output = TextUtils.commaEllipsize(mWords2, mTextView.getPaint(), mScreenWidth, "1 more", "%d more");
public static CharSequence concat(CharSequence... text)
text 为可变参数,可以将传入的CharSequence
组成一个CharSequence
,并保留原有的Span
。
例子:
CharSequence charSequence = TextUtils.concat(mSpanny1, mSpanny2);
mOutputView.setText(charSequence);
public static void copySpansFrom(Spanned source, int start, int end,
Class kind,
Spannable dest, int destoff)
从source
中start
到end
中的span
复制到dest
中,destoff
是偏移量。这个方法在concat
中有用到。
例子:
String words = mWords1 + mWords2;
mTextView.setText(words);
mTextView.append("\n\n");
mTextView.append(mSpanny2);
SpannableString ss = new SpannableString(words);
TextUtils.copySpansFrom(mSpanny2, 0, mSpanny2.length(), Object.class, ss, mWords1.length());
mOutputView.setText(ss);
public static void dumpSpans(CharSequence cs, Printer printer, String prefix)
打印cs
中的Span
,prefix
会在打印每个Span
开始出现。printer
,可以用LogPrinter
,这样就可以打印在 log 里。
例子:
TextUtils.dumpSpans(mSpanny1, new LogPrinter(Log.INFO, "kenneth"), "yo");
Log日志
07-01 14:53:20.229 9835-9835/me.kenneth.textutildemo I/kenneth: yo很长: 4189d0d0 android.text.style.BackgroundColorSpan (3-5) fl=#33
07-01 14:53:20.229 9835-9835/me.kenneth.textutildemo I/kenneth: yo很长: 4189d3a8 android.text.style.BackgroundColorSpan (5-7) fl=#33
07-01 14:53:20.229 9835-9835/me.kenneth.textutildemo I/kenneth: yo很长: 4189d5b8 android.text.style.BackgroundColorSpan (10-12) fl=#33
07-01 14:53:20.230 9835-9835/me.kenneth.textutildemo I/kenneth: yo很长: 4189d728 android.text.style.BackgroundColorSpan (12-14) fl=#33
public static CharSequence ellipsize(CharSequence text,
TextPaint paint,
float avail, TruncateAt where,
boolean preserveLength,
EllipsizeCallback callback)
相当于 TextView
的 xml 中ellipsize
,这里可以回调省略范围的 index
,同时也可用通过preserveLength
,设置返回的 CharSequence
的长度为原始长度还是省略后的长度,这里利用的”零宽不换行空格符”来占位,where
参数可以用TextUtils.TruncateAt.START
,TextUtils.TruncateAt.END
,TextUtils.TruncateAt.MIDDLE
和TextUtils.TruncateAt.MARQUEE
,分别是开始,结尾,中间和跑马灯。
例子:
CharSequence ellipsize = TextUtils.ellipsize(mWords2, mTextView.getPaint(), mScreenWidth, TextUtils.TruncateAt.START, true, new TextUtils.EllipsizeCallback() {
@Override
public void ellipsized(int i, int i1) {
Log.i(TAG, "被省略范围 " + i + " " + i1);
}
});
public static boolean equals(CharSequence a, CharSequence b)
比较字符串是否相等,可以看一下源码,如果是相同文本内容,但是span
不同,也可以比较为相同。
例子:
TextUtils.equals(mWords1, mSpanny1)
public static CharSequence expandTemplate(CharSequence template,
CharSequence... values)
替换template
当中的^1`` ^2
等为values
中相应的值,注意:不能超过9个,9个以上会抛出异常。
例子:
String template = "This is a ^1 of the ^2 broadcast ^3.";
mTextView.setText(template);
CharSequence expandTemplate = TextUtils.expandTemplate(template, "test", "emergency", "system");
public static int getCapsMode(CharSequence cs, int off, int reqModes)
这个方法不知道怎么用,求留言赐教。
public static void getChars(CharSequence s, int start, int end,
char[] dest, int destoff)
分别各自调用 CharSequence
的 getChars
实现。
例子:
char[] buffer = new char[5];
TextUtils.getChars(mWords1, 2, 4, buffer, 0);
public static int getLayoutDirectionFromLocale(Locale locale)
根据传入的 local
获取当前的阅读习惯(例如,汉语习惯是左到右,希伯来语是右到左),具体可以看这篇文章,http://droidyue.com/blog/2014/07/07/support-rtl-in-android/index.html
public static int getOffsetAfter(CharSequence text, int offset)
获取文本之后的偏移量 结合方法里的内容看比较容易,方法里面的Unicode
都是我们所谓的非法字符。
例子:
mTextView.setText(mWords1);
mTextView.append("\n\n");
mWords1 = mWords1.replace("很", "\uD800");
mWords1 = mWords1.replace("长", "\uDFFF");
mTextView.append(mWords1);
int offsetAfter = TextUtils.getOffsetAfter(mWords1, 5);
mOutputView.setText(String.valueOf(offsetAfter));
mOutputView.append("\n\n");
mOutputView.append(mWords1.substring(offsetAfter));
public static int getOffsetBefore(CharSequence text, int offset)
获取文本之前的偏移量 结合方法里的内容看比较容易,方法里面的Unicode
都是我们所谓的非法字符。
例子:
mTextView.setText(mWords1);
mTextView.append("\n\n");
mWords1 = mWords1.replace("句", "\uD800");
mWords1 = mWords1.replace("话", "\uDFFF");
mTextView.setText(mWords1);
int offsetBefore = TextUtils.getOffsetBefore(mWords1, 5);
mOutputView.setText(String.valueOf(offsetBefore));
mOutputView.append("\n\n");
mOutputView.append(mWords1.substring(offsetBefore));
public static CharSequence getReverse(CharSequence source,
int start, int end)
翻转start
到end
的字符串。
例子:
CharSequence reverse = TextUtils.getReverse(mWords1, 0, mWords1.length());
public static int getTrimmedLength(CharSequence s)
trim 后的字符串长度。
例子:
mWords1 = " " + mWords1 + " ";
mTextView.setText(mWords1);
mTextView.append("\n\n");
mTextView.append(String.valueOf(mWords1.length()));
int trimmedLength = TextUtils.getTrimmedLength(mWords1);
mOutputView.setText(String.valueOf(trimmedLength));
public static String htmlEncode(String s)
encode html ,注意是 html 。
例子:
String code = "html
" + mWords1;
mTextView.setText(code);
mOutputView.setText(TextUtils.htmlEncode(code));
public static int indexOf(CharSequence s, CharSequence needle,
int start, int end)
获取needle
字符的 index。
例子:
int indexOf = TextUtils.indexOf(mWords1, "不要的", 0, mWords1.length());
mOutputView.setText(String.valueOf(indexOf));
mOutputView.append(mWords1.substring(indexOf));
public static boolean isDigitsOnly(CharSequence str)
判断是否仅有数字。
例子:
mTextView.setText(mWords1);
String digits = "1234";
mTextView.append("\n\n");
mTextView.append(digits);
String digits1 = "123w123";
mTextView.append("\n\n");
mTextView.append(digits1);
boolean digitsOnly = TextUtils.isDigitsOnly(mWords1);
boolean digitsOnly1 = TextUtils.isDigitsOnly(digits);
boolean digitsOnly2 = TextUtils.isDigitsOnly(digits1);
mOutputView.setText(String.valueOf(digitsOnly));
mOutputView.append("\n\n");
mOutputView.append(String.valueOf(digitsOnly1));
mOutputView.append("\n\n");
mOutputView.append(String.valueOf(digitsOnly2));
public static boolean isEmpty(CharSequence str)
判空,这个太常用了。
public static boolean isGraphic(CharSequence str)
判断是否有可以显示出来的字符。
例子:
String graphic = "\n \t \b";
mTextView.setText(graphic);
mOutputView.setText(String.valueOf(TextUtils.isGraphic(graphic)));
public static String join(CharSequence delimiter, Iterable tokens)
连接数组,例如:a b c d 输出 a-b-c-d,这个方法的重载支持了很多类型。
例子:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
mTextView.setText(list.toString());
mOutputView.setText(TextUtils.join("-", list));
public static int lastIndexOf(CharSequence s, char ch)
字符ch
最后一次出现的index
。
例子:
mTextView.setText(mWords1);
int c = TextUtils.lastIndexOf(mWords1, 'c'); mOutputView.setText(String.valueOf(c));
mOutputView.append("\n\n"); mOutputView.append(mWords1.substring(c));
public static boolean regionMatches(CharSequence one, int toffset,
CharSequence two, int ooffset,
int len) {
比对两个字符串 offset
到 len
的长度的字符串是否相同。
例子:
mOutputView.setText(TextUtils.replace(mWords1,new String[]{"很长","的","."},new String[]{"very long","of","。"}));
public static CharSequence replace(CharSequence template,
String[] sources,
CharSequence[] destinations)
替换功能,注意:只会替换第一个出现的。
例子:
mOutputView.setText(TextUtils.replace(mWords1,new String[]{"很长","的","."},new String[]{"very long","of","。"}));
public static String[] split(String text, String expression)
分割字符串。
例子:
mOutputView.setText(TextUtils.join("--",TextUtils.split(mWords2,",")));
public static CharSequence stringOrSpannedString(CharSequence source)
如果是 String
返回 String
,spannedString
或 spanned
返回 spannedString
。
例子:
mOutputView.setText(TextUtils.stringOrSpannedString(mSpanny1));
public static String substring(CharSequence source, int start, int end)
分割字符串。
例子:
mOutputView.setText(TextUtils.substring(mSpanny1,2,16));
public static void writeToParcel(CharSequence cs, Parcel p,
int parcelableFlags)
例子:
mTextView.setText("一般用作序列化 CharSequence 子类");