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

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

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

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

  • 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.

不知道你看懂沒有,可能是因為英文水平的問題,我反正是看的很含糊不清。
既然這樣,那最好的辦法就是自己打個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之間添加一個0,現(xiàn)在文字變成了abc0123,再看下LOGCAT的顯示:

再把0給刪掉,log如下:

把0替換成12:

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

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

Tips:

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

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

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

一個完整的TextWatcher例子:

    // 用于屏蔽空格輸入的TextWatcher
    TextWatcher watcher = new TextWatcher() {
        private String mBefore;// 用于記錄變化前的文字
        private int mCursor;// 用于記錄變化時光標(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三個回調(diào)以及監(jiān)聽EditText的輸入案例詳解的文章就介紹到這了,更多相關(guān)Android TextWatcher三個回調(diào)以及監(jiān)聽EditText的輸入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

洛阳市| 中超| 莒南县| 绵竹市| 腾冲县| 夏邑县| 南召县| 平安县| 繁峙县| 华亭县| 谢通门县| 晋宁县| 渝北区| 三门峡市| 昆明市| 依安县| 岗巴县| 天等县| 洞头县| 额尔古纳市| 大厂| 楚雄市| 潍坊市| 安国市| 丹棱县| 深州市| 连州市| 集安市| 水富县| 呼图壁县| 思茅市| 寻甸| 平邑县| 马龙县| 台南市| 宁津县| 芦溪县| 道真| 清原| 尚志市| 连州市|