Android8之前版本 Spannable無(wú)效問(wèn)題

最近發(fā)現(xiàn)在Android8.0之前的手機(jī)上設(shè)置Spannable無(wú)效懒构,后來(lái)調(diào)研發(fā)現(xiàn)問(wèn)題是因?yàn)閠extAllCaps屬性和Spannable沖突問(wèn)題,把textAllCaps屬性設(shè)置為false就好了胆剧。

下面是具體原因:

textAllCaps屬性會(huì)作用在 AllCapsTransformationMethod類上
這個(gè)類是用來(lái)實(shí)現(xiàn)將文字變大寫的秩霍,具體來(lái)說(shuō)是其中的getTransformation方法

8.0之前

該方法在8.0以前的源碼是:

    @Override
    public CharSequence getTransformation(CharSequence source, View view) {
        //省略若干無(wú)用代碼
        return source.toString().toUpperCase();
    }

這個(gè)方法的入?yún)⑵鋵?shí)是個(gè)Spannable對(duì)象鸽照,通過(guò)toString().toUpperCase()等操作匿垄,返回對(duì)象變成了String归粉, 丟掉了很多我們所期望的特效(刪除線漏峰、背景色、圖片等)

8.0之后

在8.0以后的源碼中該方法改為返回Spannable

以8.1版本的源碼為例

可以直接略過(guò)下面兩塊代碼看結(jié)論

    @Override
    public CharSequence getTransformation(@Nullable CharSequence source, View view) {
        if (!mEnabled) {
            Log.w(TAG, "Caller did not enable length changes; not transforming text");
            return source;
        }

        if (source == null) {
            return null;
        }

        Locale locale = null;
        if (view instanceof TextView) {
            locale = ((TextView)view).getTextLocale();
        }
        if (locale == null) {
            locale = mLocale;
        }
        final boolean copySpans = source instanceof Spanned;
        return TextUtils.toUpperCase(locale, source, copySpans);
    }

TextUtils的toUpperCase方法源碼如下:

    public static CharSequence toUpperCase(@Nullable Locale locale, @NonNull CharSequence source,
            boolean copySpans) {
        final Edits edits = new Edits();
        if (!copySpans) { // No spans. Just uppercase the characters.
            final StringBuilder result = CaseMap.toUpper().apply(
                    locale, source, new StringBuilder(), edits);
            return edits.hasChanges() ? result : source;
        }

        final SpannableStringBuilder result = CaseMap.toUpper().apply(
                locale, source, new SpannableStringBuilder(), edits);
        if (!edits.hasChanges()) {
            // No changes happened while capitalizing. We can return the source as it was.
            return source;
        }

        final Edits.Iterator iterator = edits.getFineIterator();
        final int sourceLength = source.length();
        final Spanned spanned = (Spanned) source;
        final Object[] spans = spanned.getSpans(0, sourceLength, Object.class);
        for (Object span : spans) {
            final int sourceStart = spanned.getSpanStart(span);
            final int sourceEnd = spanned.getSpanEnd(span);
            final int flags = spanned.getSpanFlags(span);
            // Make sure the indices are not at the end of the string, since in that case
            // iterator.findSourceIndex() would fail.
            final int destStart = sourceStart == sourceLength ? result.length() :
                    toUpperMapToDest(iterator, sourceStart);
            final int destEnd = sourceEnd == sourceLength ? result.length() :
                    toUpperMapToDest(iterator, sourceEnd);
            result.setSpan(span, destStart, destEnd, flags);
        }
        return result;
    }

發(fā)現(xiàn)沒(méi)!在8.1版本中不再是簡(jiǎn)單的toString席噩、toUpperCase贤壁,它會(huì)將之前的Span信息存取下來(lái),返回的時(shí)候也會(huì)一并返回回去馒索,這樣下來(lái)TextView就可以根據(jù)這些返回的Span信息來(lái)給文本設(shè)置各種特效了名船。

友情提示

剛剛看了下androidx的包,發(fā)現(xiàn)也是簡(jiǎn)單的toString蜈块、toUpperCase迷扇,所以使用的時(shí)候需要注意。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末信峻,一起剝皮案震驚了整個(gè)濱河市瓮床,隨后出現(xiàn)的幾起案子产镐,更是在濱河造成了極大的恐慌,老刑警劉巖丑掺,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件述雾,死亡現(xiàn)場(chǎng)離奇詭異兼丰,居然都是意外死亡唆缴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)趟紊,“玉大人,你說(shuō)我怎么就攤上這事戴差☆踔觯” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵饭入,是天一觀的道長(zhǎng)肛真。 經(jīng)常有香客問(wèn)我,道長(zhǎng)乾忱,這世上最難降的妖魔是什么历极? 我笑而不...
    開(kāi)封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蹄葱,結(jié)果婚禮上锄列,老公的妹妹穿的比我還像新娘。我一直安慰自己竣况,他們只是感情好筒严,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布情萤。 她就那樣靜靜地躺著筋岛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泉蝌。 梳的紋絲不亂的頭發(fā)上揩晴,一...
    開(kāi)封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天硫兰,我揣著相機(jī)與錄音,去河邊找鬼劫映。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雌桑,可吹牛的內(nèi)容都是我干的祖今。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼耍目,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼徐绑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起毅访,我...
    開(kāi)封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烫幕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捷犹,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年侣颂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枪孩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拒担,死狀恐怖攻询,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情低零,我是刑警寧澤拯杠,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布潭陪,位于F島的核電站,受9級(jí)特大地震影響畔咧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜誓沸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一拜隧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洪添,春花似錦、人聲如沸痊焊。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)垄惧。三九已至,卻和暖如春到逊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脑题。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工旭蠕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旷坦,地道東北人掏熬。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像秒梅,于是被迫代替她去往敵國(guó)和親旗芬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程捆蜀,因...
    小菜c閱讀 6,402評(píng)論 0 17
  • 在項(xiàng)目中很常用到Spannable疮丛,既豐富了文本又精簡(jiǎn)了布局。SpannableString辆它、Spanna...
    尋味Android閱讀 1,391評(píng)論 0 2
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評(píng)論 0 4
  • 第3章 基本概念 3.1 語(yǔ)法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡(jiǎn)單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,124評(píng)論 0 21
  • why: 1,微服務(wù)架構(gòu)微服務(wù)增多誊薄,一個(gè)客戶端請(qǐng)求形成一個(gè)復(fù)雜的分布式服務(wù)調(diào)用鏈路,如果任何一個(gè)服務(wù)延遲過(guò)高或...
    xiaoyang08閱讀 3,853評(píng)論 0 5