Android EditText的使用及值得注意的地方

??Android上有很多輸入法應(yīng)用,每種輸入法都有各自的特點(diǎn)身堡,輸入法多數(shù)時(shí)候是和EditText配合使用邓尤,結(jié)合我自己的親身實(shí)踐分享一下使用EditText過程中遇到的一些問題及解決方法。

設(shè)置默認(rèn)輸入法

??有時(shí)候?yàn)榱颂岣哂脩趔w驗(yàn)贴谎,在彈出輸入法時(shí)需要設(shè)置默認(rèn)的輸入狀態(tài)汞扎,比如單詞應(yīng)用彈出輸入法時(shí),輸入法最好是在英文輸入狀態(tài)下擅这。如果是字典應(yīng)用澈魄,彈出輸入法時(shí)最好是在中文輸入狀態(tài)下,Android并沒有提供設(shè)置默認(rèn)的輸入狀態(tài)的接口仲翎,但我們可以通過如下方法一樣能夠達(dá)到想要的效果:

??默認(rèn)中文:

mEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT);

??默認(rèn)英文:

mEditText.setInputType(EditorInfo.TYPE_TEXT_VARIATION_URI);

打開和關(guān)閉輸入法

??手動(dòng)控制輸入法的開關(guān)狀態(tài)也能提升用戶體驗(yàn)痹扇,比如:

  • 有的搜索框會(huì)有一個(gè)清除按鈕,點(diǎn)擊清除按鈕時(shí)就應(yīng)該彈出輸入法溯香,因?yàn)橛脩羟宄阉鲀?nèi)容的目的多數(shù)時(shí)候是需要輸入新的內(nèi)容鲫构;

  • 執(zhí)行搜索時(shí)應(yīng)該隱藏輸入法,因?yàn)轱@示輸入法時(shí)會(huì)遮擋搜索結(jié)果逐哈,用戶體驗(yàn)不太好芬迄;

  • 鬧鐘來時(shí)或者有其它window彈出時(shí)應(yīng)該隱藏輸入法,因?yàn)檩斎敕ㄒ彩莣indow昂秃,如果不隱藏可能導(dǎo)致輸入法遮擋住了其它window等用戶體驗(yàn)不太友好的問題禀梳。

??打開輸入法:

private void open(Context context, View editText){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.showSoftInput(editText, 0);
}

??關(guān)閉輸入法:

private void close(Context context, View editText){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}

監(jiān)聽EditText的輸入狀態(tài)

  • 類似新浪微博,在輸入內(nèi)容時(shí)會(huì)提示還可以輸入多少字肠骆;

  • 有的搜索引擎算途,輸入內(nèi)容時(shí)實(shí)時(shí)顯示搜索結(jié)果;

  • 有的輸入框有輸入長(zhǎng)度限制蚀腿,輸入內(nèi)容超過長(zhǎng)度限制時(shí)彈出提示信息嘴瓤。

??上面這些都可以通過監(jiān)聽EditText的輸入狀態(tài)來實(shí)現(xiàn),具體實(shí)現(xiàn)方式如下:

mInputEditTxt.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            System.out.println("監(jiān)聽EditText輸入內(nèi)容的變化莉钙,在這里可以監(jiān)聽輸入內(nèi)容的長(zhǎng)度廓脆。");
        }

        @Override
        public void afterTextChanged(Editable s) {
            System.out.println("這里可以實(shí)現(xiàn)所輸即所得,用戶輸入的同時(shí)可以立即在這里根據(jù)輸入內(nèi)容執(zhí)行操作磁玉,顯示搜索結(jié)果停忿!");
        }
    });

監(jiān)聽輸入法中的回車按鈕

??比如搜狗輸入法的右下角有一個(gè)回車按鈕,我們希望用戶點(diǎn)擊它時(shí)也執(zhí)行確認(rèn)功能蚊伞,可以通過監(jiān)聽EditText的按鍵點(diǎn)擊事件來實(shí)現(xiàn):

/**
     * 監(jiān)聽輸入法按鍵
     * 
     * */
    mInputEditTxt.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
                System.out.println("手指彈起時(shí)執(zhí)行確認(rèn)功能");
                return true;
            }

            return false;
        }
    });

改變輸入法中回車按鈕的顯示內(nèi)容

??如果回車按鈕是執(zhí)行搜索功能席赂,則回車按鈕上顯示"搜索"吮铭,如果是執(zhí)行發(fā)送功能,則顯示"發(fā)送",如果是下一步颅停,則顯示"下一步"谓晌。

??實(shí)現(xiàn)這個(gè)功能需要調(diào)用EditText的setImeOptions方法:

/**
*
* IME_ACTION_SEARCH 搜索
* IME_ACTION_SEND 發(fā)送
* IME_ACTION_NEXT 下一步
* IME_ACTION_DONE 完成
*/
mInputEditTxt.setImeOptions(EditorInfo.IME_ACTION_SEARCH);

限制輸入內(nèi)容

??有時(shí)候我們根本就不想用戶輸入一些雜七雜八的內(nèi)容,因?yàn)檫@需要程序針對(duì)輸入的內(nèi)容做各種處理癞揉,如果處理不當(dāng)還會(huì)有好多不可預(yù)見的問題纸肉,索性在輸入內(nèi)容時(shí)就禁止用戶輸入一些非法字符,這可以通過下面的方式實(shí)現(xiàn)烧董,新建一個(gè)類InputTxtFilter:

public class InputTxtFilter{
    public static final int INPUT_TYPE_EN = 0x01;
    public static final int INPUT_TYPE_CH = 0x02;
    private static final String[] SPELL = new String[]{
        "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
        "ā","á","ǎ","à","ō","ó","ǒ","ò","ē","é","ě","è","ī","í","ǐ","ì","ū","ú","ǔ","ù","ǖ","ǘ","ǚ","ǜ","ü"
    };
    private static char[] chineseParam = new char[]{'」','毁靶,','。','逊移?','…',':','~','【','#','预吆、','%','*','&','$','(','‘','’','“','”','『','〔','{','【'
        ,'¥','£','‖','〖','《','「','》','〗','】','}','〕','』','”',')','!','胳泉;','—'};
    
    private InputTxtFilter( ){
        
    }
    
    public static void inputFilter( final Context context, final EditText editText, final int type, final int inputLimit){
        InputFilter[] filters = new InputFilter[1];
        filters[0] = new InputFilter.LengthFilter(inputLimit){
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend){
                boolean isRightCharater = false;
                if(type == INPUT_TYPE_EN){
                    isRightCharater = isLetter(source.toString());
                }else if(type == INPUT_TYPE_CH){
                    isRightCharater = isChineseWord(source.toString());
                }
                
                if ( !isRightCharater|| dest.toString( ).length( )>=inputLimit ){
                    return "";
                }

                return source;
            }
        };
        editText.setFilters(filters);
    }
    
    /**
     * 檢測(cè)String是否全是中文
     * 
     */
    public static boolean isChineseWord( String name ){
        boolean res=true;
        char[] cTemp = name.toCharArray( );
        
        for( int i = 0; i < name.length( ); i++ ){
            if( !isChinese( cTemp[ i ] ) ){
                res=false;
                break;
            }
        }
        
        return res;
    }
    
    /**
     * 是否為英文字母
     * 
     * */
    public static boolean isLetter( String inputStr ){
        char[] inputArray = inputStr.toCharArray( );
        List<String> spellList = Arrays.asList( SPELL );
        
        for( char input : inputArray ){
            if( !spellList.contains( input + "" ) ){
                return false;
            }
        }
        
        return true;
    }
    
    /**
     * 判定輸入漢字
     * @param c
     */
    public static boolean isChinese( char c ){
        for( char param : chineseParam ){
            if( param == c ){
                return false;
            }
        }
        
        Character.UnicodeBlock ub = Character.UnicodeBlock.of( c );
        if ( ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
            || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
            || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
            || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
            || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
            || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS ){
            return true;
        }
        
        return false;
    }
}

??在初始化EditText時(shí)拐叉,調(diào)用InputTxtFilter的inputFilter方法,傳入輸入長(zhǎng)度限制扇商、輸入內(nèi)容的類型限制等即可凤瘦,eg:

InputTxtFilter.inputFilter(this, mInputEditTxt, InputTxtFilter.INPUT_TYPE_EN, 5);

屏蔽EditText的復(fù)制、粘貼功能

??在低版本的Android SDK中案铺,如果對(duì)EditText的輸入長(zhǎng)度有限制時(shí)蔬芥,長(zhǎng)按EditText并將選中的內(nèi)容拖動(dòng)到EditText輸入框中,如果這時(shí)候的長(zhǎng)度超過了EditText的輸入長(zhǎng)度限制控汉,程序會(huì)直接崩潰掉笔诵,在高版本的Android SDK中這個(gè)問題已經(jīng)改了,如果出現(xiàn)上面的情況會(huì)直接清空輸入框中的內(nèi)容姑子,為了避免這種討厭的問題乎婿,我們可以屏蔽EditText的復(fù)制和粘貼功能,只需要屏蔽EditText的長(zhǎng)按響應(yīng)即可:

/**
     * 屏蔽復(fù)制街佑、粘貼功能
     * 
     * */
    mInputEditTxt.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            return false;
        }

        public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
            return false;
        }

        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            
        }
    });
    
    mInputEditTxt.setLongClickable(false);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谢翎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沐旨,更是在濱河造成了極大的恐慌森逮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磁携,死亡現(xiàn)場(chǎng)離奇詭異吊宋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門璃搜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鳞上,你說我怎么就攤上這事这吻。” “怎么了篙议?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵唾糯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鬼贱,道長(zhǎng)移怯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任这难,我火速辦了婚禮舟误,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姻乓。我一直安慰自己嵌溢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布蹋岩。 她就那樣靜靜地躺著赖草,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剪个。 梳的紋絲不亂的頭發(fā)上秧骑,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音扣囊,去河邊找鬼乎折。 笑死,一個(gè)胖子當(dāng)著我的面吹牛如暖,可吹牛的內(nèi)容都是我干的笆檀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼盒至,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酗洒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枷遂,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤樱衷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后酒唉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矩桂,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年痪伦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侄榴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雹锣。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖癞蚕,靈堂內(nèi)的尸體忽然破棺而出蕊爵,到底是詐尸還是另有隱情,我是刑警寧澤桦山,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布攒射,位于F島的核電站,受9級(jí)特大地震影響恒水,放射性物質(zhì)發(fā)生泄漏会放。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一钉凌、第九天 我趴在偏房一處隱蔽的房頂上張望咧最。 院中可真熱鬧,春花似錦甩骏、人聲如沸窗市。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咨察。三九已至,卻和暖如春福青,著一層夾襖步出監(jiān)牢的瞬間摄狱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工无午, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媒役,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓宪迟,卻偏偏與公主長(zhǎng)得像酣衷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子次泽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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