TextUtils方法介绍

把一个List<String>输出成a,b,c这种形式,我们项目里面提供了一个这样的工具类:

public static String getString(List<String> 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 SDKTextUtils里面就有提供了一个方法join,可以达到效果。

平常我开发用TextUtils中最多的方法分别是isEmptyequals。其他方法了解并不多,或者不了解,下面我们开始介绍一下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);
            }
        });

commaEllipsize

public static CharSequence commaEllipsize(CharSequence text,
                                              TextPaint p, float avail,
                                              String oneMore,
                                              String more)

例如Andy, Bob, Charles, David这样的句子,修改为能够在一行avail宽度显示。发回结果例如
Andy, Bob, 1 moreAndy, Bob, 2 more
注意:more 中的数字要有%d来format,来显示不同的数字。text中必须用英文逗号分隔。

例子:

CharSequence output = TextUtils.commaEllipsize(mWords2, mTextView.getPaint(), mScreenWidth, "1 more", "%d more");

concat

public static CharSequence concat(CharSequence... text)

text 为可变参数,可以将传入的CharSequence组成一个CharSequence,并保留原有的Span

例子:

CharSequence charSequence = TextUtils.concat(mSpanny1, mSpanny2);
                mOutputView.setText(charSequence);

copySpansFrom

public static void copySpansFrom(Spanned source, int start, int end,
                                     Class kind,
                                     Spannable dest, int destoff)

sourcestartend 中的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);

dumpSpans

public static void dumpSpans(CharSequence cs, Printer printer, String prefix)

打印cs中的Spanprefix会在打印每个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

ellipsize

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.STARTTextUtils.TruncateAt.ENDTextUtils.TruncateAt.MIDDLETextUtils.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);
                    }
                });

equals

public static boolean equals(CharSequence a, CharSequence b)

比较字符串是否相等,可以看一下源码,如果是相同文本内容,但是span不同,也可以比较为相同。

例子:

TextUtils.equals(mWords1, mSpanny1)

expandTemplate

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");

getCapsMode

public static int getCapsMode(CharSequence cs, int off, int reqModes)

这个方法不知道怎么用,求留言赐教。

getChars

public static void getChars(CharSequence s, int start, int end,
                                char[] dest, int destoff)

分别各自调用 CharSequencegetChars实现。

例子:

char[] buffer = new char[5];
                TextUtils.getChars(mWords1, 2, 4, buffer, 0);

getLayoutDirectionFromLocale

public static int getLayoutDirectionFromLocale(Locale locale)

根据传入的 local获取当前的阅读习惯(例如,汉语习惯是左到右,希伯来语是右到左),具体可以看这篇文章,http://droidyue.com/blog/2014/07/07/support-rtl-in-android/index.html

getOffsetAfter

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));

getOffsetBefore

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));

getReverse

public static CharSequence getReverse(CharSequence source,
                                          int start, int end)

翻转startend的字符串。

例子:

CharSequence reverse = TextUtils.getReverse(mWords1, 0, mWords1.length());

getTrimmedLength

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));

htmlEncode

public static String htmlEncode(String s)

encode html ,注意是 html 。

例子:

String code = "<h1>html</h1> " + mWords1;
                mTextView.setText(code);
                mOutputView.setText(TextUtils.htmlEncode(code));

indexOf

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));

isDigitsOnly

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));

isEmpty

public static boolean isEmpty(CharSequence str)

判空,这个太常用了。

isGraphic

public static boolean isGraphic(CharSequence str) 

判断是否有可以显示出来的字符。

例子:

String graphic = "\n \t \b";
mTextView.setText(graphic);
            mOutputView.setText(String.valueOf(TextUtils.isGraphic(graphic)));

join

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));

lastIndexOf

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));

regionMatches

public static boolean regionMatches(CharSequence one, int toffset,
                                        CharSequence two, int ooffset,
                                        int len) {

比对两个字符串 offsetlen 的长度的字符串是否相同。

例子:

mOutputView.setText(TextUtils.replace(mWords1,new String[]{"很长","的","."},new String[]{"very long","of","。"}));

replace

public static CharSequence replace(CharSequence template,
                                       String[] sources,
                                       CharSequence[] destinations)

替换功能,注意:只会替换第一个出现的。

例子:

mOutputView.setText(TextUtils.replace(mWords1,new String[]{"很长","的","."},new String[]{"very long","of","。"}));   

split

public static String[] split(String text, String expression)

分割字符串。

例子:

mOutputView.setText(TextUtils.join("--",TextUtils.split(mWords2,",")));

stringOrSpannedString

public static CharSequence stringOrSpannedString(CharSequence source)

如果是 String 返回 StringspannedStringspanned 返回 spannedString

例子:

mOutputView.setText(TextUtils.stringOrSpannedString(mSpanny1));    

substring

public static String substring(CharSequence source, int start, int end)

分割字符串。

例子:

mOutputView.setText(TextUtils.substring(mSpanny1,2,16));

writeToParcel

public static void writeToParcel(CharSequence cs, Parcel p,
            int parcelableFlags)

例子:

mTextView.setText("一般用作序列化 CharSequence 子类");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值