最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android TextWatcher三個(gè)回調(diào)以及監(jiān)聽(tīng)EditText的輸入案例詳解

 更新時(shí)間:2021年08月30日 10:14:35   作者:LittleFogCat  
這篇文章主要介紹了Android TextWatcher三個(gè)回調(diào)以及監(jiān)聽(tīng)EditText的輸入案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

TextWatcher是一個(gè)監(jiān)聽(tīng)字符變化的類。當(dāng)我們調(diào)用EditText的addTextChangedListener(TextWatcher)方法之后,就可以監(jiān)聽(tīng)EditText的輸入了。
在new出一個(gè)TextWatcher之后,我們需要實(shí)現(xiàn)三個(gè)抽象方法:

  • beforeTextChanged
  • onTextChanged
  • afterTextChanged

看下beforeTextChanged的注釋:

This method is called to notify you that, within s, the count characters beginning at start are about to be replaced by new text with length after. It is an error to attempt to make changes to s from this callback.

不知道你看懂沒(méi)有,可能是因?yàn)橛⑽乃降膯?wèn)題,我反正是看的很含糊不清。
既然這樣,那最好的辦法就是自己打個(gè)log試一下了。

    EditText et = (EditText) findViewById(R.id.et);
    TextWatcher watcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            Log.d(TAG, "beforeTextChanged: s = " + s + ", start = " + start +
                    ", count = " + count + ", after = " + after);
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Log.d(TAG, "onTextChanged: s = " + s + ", start = " + start +
                    ", before = " + before + ", count = " + count);
        }

        @Override
        public void afterTextChanged(Editable s) {
            Log.d(TAG, "afterTextChanged: " + s);
        }
    };
    et.addTextChangedListener(watcher);

首先輸入abc123

然后在c和1之間添加一個(gè)0,現(xiàn)在文字變成了abc0123,再看下LOGCAT的顯示:

再把0給刪掉,log如下:

把0替換成12:

通過(guò)Log,結(jié)合Android源碼注釋,可以得出結(jié)論:

  • beforeTextChanged(CharSequence s, int start, int count, int after)
    s: 修改之前的文字。
    start: 字符串中即將發(fā)生修改的位置。
    count: 字符串中即將被修改的文字的長(zhǎng)度。如果是新增的話則為0。
    after: 被修改的文字修改之后的長(zhǎng)度。如果是刪除的話則為0。
  • onTextChanged(CharSequence s, int start, int before, int count)
    s: 改變后的字符串
    start: 有變動(dòng)的字符串的序號(hào)
    before: 被改變的字符串長(zhǎng)度,如果是新增則為0。
    count: 添加的字符串長(zhǎng)度,如果是刪除則為0。
  • afterTextChanged(Editable s)
    s: 修改后的文字

Tips:

**需要特別注意的是,在TextWatcher中setText要小心不要陷入死循環(huán)。**即:
文字改變->watcher接收到通知->setText->文字改變->watcher接受到通知->…
在watcher中使用setText的解決方案

關(guān)于這三個(gè)回調(diào)方法調(diào)用的時(shí)機(jī),可以參考這篇文章

當(dāng)對(duì)EditText使用setText之后,記得再使用setSelection()來(lái)設(shè)置光標(biāo)位置。

一個(gè)完整的TextWatcher例子:

    // 用于屏蔽空格輸入的TextWatcher
    TextWatcher watcher = new TextWatcher() {
        private String mBefore;// 用于記錄變化前的文字
        private int mCursor;// 用于記錄變化時(shí)光標(biāo)的位置

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            mBefore = s.toString();
            mCursor = start;
            Log.d(TAG, "beforeTextChanged: " + s + ", " + mCursor);
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Log.d(TAG, "onTextChanged: " + s);
        }

        @Override
        public void afterTextChanged(Editable s) {
            Log.d(TAG, "afterTextChanged: " + s);
            // 這里圖方便,是在afterTextChanged判斷是否輸入之后含有空格,并不是最好的方案
            // 理論上應(yīng)該在onTextChanged中判斷輸入內(nèi)容
            if (s.toString().contains(" ")) {
                Log.i(TAG, "onTextChanged: 包含空格, 設(shè)置" + mBefore);
                et.removeTextChangedListener(this);
                et.setText(mBefore);
                et.addTextChangedListener(this);
                et.setSelection(mCursor);
            }
        }
    };
    et.addTextChangedListener(watcher);

到此這篇關(guān)于Android TextWatcher三個(gè)回調(diào)以及監(jiān)聽(tīng)EditText的輸入案例詳解的文章就介紹到這了,更多相關(guān)Android TextWatcher三個(gè)回調(diào)以及監(jiān)聽(tīng)EditText的輸入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

德钦县| 宁波市| 娄烦县| 宜都市| 万州区| 华阴市| 天镇县| 岱山县| 隆子县| 兰西县| 涿州市| 威海市| 镇江市| 马边| 方正县| 河津市| 裕民县| 冀州市| 公主岭市| 印江| 紫云| 内乡县| 仙桃市| 河西区| 唐山市| 云安县| 云林县| 株洲县| 游戏| 天等县| 穆棱市| 合水县| 孟津县| 卓资县| 田东县| 克什克腾旗| 墨脱县| 临汾市| 五河县| 通海县| 板桥市|