Android EditText 的使用及值得注意的點——如如何屏蔽EditText的複製、粘貼功能

Android上有很多輸入法應用,每種輸入法都有各自的特點,輸入法多數時候是和EditText配合使用,結合我自己的親身實踐分享一下使用EditText過程中遇到的一些問題及解決方法。

置默認輸入法  


有時候爲了提高用戶體驗,在彈出輸入法時需要設置默認的輸入狀態,比如單詞應用彈出輸入法時,輸入法最好是在英文輸入狀態下。如果是字典應用,彈出輸入法時最好是在中文輸入狀態下,Android並沒有提供設置默認的輸入狀態的接口,但我們可以通過如下方法一樣能夠達到想要的效果:


默認中文:

mEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT);


mEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT);


默認英文:


mEditText.setInputType(EditorInfo.TYPE_TEXT_VARIATION_URI);


打開和關閉輸入法


手動控制輸入法的開關狀態也能提升用戶體驗,比如:


  • 有的搜索框會有一個清除按鈕,點擊清除按鈕時就應該彈出輸入法,因爲用戶清除搜索內容的目的多數時候是需要輸入新的內容;

  • 執行搜索時應該隱藏輸入法,因爲顯示輸入法時會遮擋搜索結果,用戶體驗不太好;

  • 鬧鐘來時或者有其它window彈出時應該隱藏輸入法,因爲輸入法也是window,如果不隱藏可能導致輸入法遮擋住了其它window等用戶體驗不太友好的問題。


打開輸入法:

privatevoidopen(Contextcontext,VieweditText){
    InputMethodManagerinputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.showSoftInput(editText,0);
}

關閉輸入法:


privatevoidclose(Contextcontext,VieweditText){

    InputMethodManagerinputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);

    inputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(),0);

}


監聽EditText的輸入狀態


  • 類似新浪微博,在輸入內容時會提示還可以輸入多少字;

  • 有的搜索引擎,輸入內容時實時顯示搜索結果;

  • 有的輸入框有輸入長度限制,輸入內容超過長度限制時彈出提示信息。


上面這些都可以通過監聽EditText的輸入狀態來實現,具體實現方式如下:


mInputEditTxt.addTextChangedListener(newTextWatcher(){

        @Override

        publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){

        }

        @Override

        publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){

            System.out.println("監聽EditText輸入內容的變化,在這裏可以監聽輸入內容的長度。");

        }

        @Override

        publicvoidafterTextChanged(Editables){

            System.out.println("這裏可以實現所輸即所得,用戶輸入的同時可以立即在這裏根據輸入內容執行操作,顯示搜索結果!");

        }

    });

監聽輸入法中的回車按鈕

比如搜狗輸入法的右下角有一個回車按鈕,我們希望用戶點擊它時也執行確認功能,可以通過監聽EditText的按鍵點擊事件來實現:

/**

     * 監聽輸入法按鍵

     *

     * */

    mInputEditTxt.setOnKeyListener(newOnKeyListener(){

        @Override

        publicbooleanonKey(Viewv,intkeyCode,KeyEventevent){

            if(keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP){

                System.out.println("手指彈起時執行確認功能");

                returntrue;

            }

            returnfalse;

        }

    });


改變輸入法中回車按鈕的顯示內容


如果回車按鈕是執行搜索功能,則回車按鈕上顯示”搜索”,如果是執行發送功能,則顯示”發送”,如果是下一步,則顯示”下一步”。


實現這個功能需要調用EditText的setImeOptions方法:


/**

*

* IME_ACTION_SEARCH 搜索

* IME_ACTION_SEND 發送

* IME_ACTION_NEXT 下一步

* IME_ACTION_DONE 完成

*/

mInputEditTxt.setImeOptions(EditorInfo.IME_ACTION_SEARCH);


限制輸入內容


有時候我們根本就不想用戶輸入一些雜七雜八的內容,因爲這需要程序針對輸入的內容做各種處理,如果處理不當還會有好多不可預見的問題,索性在輸入內容時就禁止用戶輸入一些非法字符,這可以通過下面的方式實現,新建一個類InputTxtFilter:


publicclassInputTxtFilter{

    publicstaticfinalintINPUT_TYPE_EN = 0x01;

    publicstaticfinalintINPUT_TYPE_CH = 0x02;

    privatestaticfinalString[]SPELL = newString[]{

        "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",

        "ā","á","ǎ","à","ō","ó","ǒ","ò","ē","é","ě","è","ī","í","ǐ","ì","ū","ú","ǔ","ù","ǖ","ǘ","ǚ","ǜ","ü"

    };

    privatestaticchar[]chineseParam = newchar[]{'」',',','。','?','…',':','~','【','#','、','%','*','&','$','(','‘','’','“','”','『','〔','{','【'

        ,'¥','£','‖','〖','《','「','》','〗','】','}','〕','』','”',')','!',';','—'}; 

    privateInputTxtFilter(){ 

    }

 

    publicstaticvoidinputFilter(finalContextcontext,finalEditTexteditText,finalinttype,finalintinputLimit){

        InputFilter[]filters = newInputFilter[1];

        filters[0] = newInputFilter.LengthFilter(inputLimit){

            publicCharSequence filter(CharSequencesource,intstart,intend,Spanneddest,intdstart,intdend){

                booleanisRightCharater = false;

                if(type == INPUT_TYPE_EN){

                    isRightCharater = isLetter(source.toString());

                }elseif(type == INPUT_TYPE_CH){

                    isRightCharater = isChineseWord(source.toString());

                }

 

                if( !isRightCharater||dest.toString().length()>=inputLimit){

                    return"";

                }

 

                returnsource;

            }

        };

        editText.setFilters(filters);

    }

 

    /**

     * 檢測String是否全是中文

     *

     */

    publicstaticbooleanisChineseWord(Stringname){

        booleanres=true;

        char[]cTemp = name.toCharArray();

 

        for(inti = 0;i < name.length();i++){

            if( !isChinese(cTemp[i])){

                res=false;

                break;

            }

        }

 

        returnres;

    }

 

    /**

     * 是否爲英文字母

     *

     * */

    publicstaticbooleanisLetter(StringinputStr){

        char[]inputArray = inputStr.toCharArray();

        List<String>spellList = Arrays.asList(SPELL);

 

        for(charinput : inputArray){

            if( !spellList.contains(input + "")){

                returnfalse;

            }

        }

 

        returntrue;

    }

 

    /**

     * 判定輸入漢字

     * @param c

     */

    publicstaticbooleanisChinese(charc){

        for(charparam : chineseParam){

            if(param == c){

                returnfalse;

            }

        }

 

        Character.UnicodeBlockub = 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){

            returntrue;

        }

 

        returnfalse;

    }

}


在初始化EditText時,調用InputTxtFilter的inputFilter方法,傳入輸入長度限制、輸入內容的類型限制等即可,eg:


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


屏蔽EditText的複製、粘貼功能


在低版本的Android SDK中,如果對EditText的輸入長度有限制時,長按EditText並將選中的內容拖動到EditText輸入框中,如果這時候的長度超過了EditText的輸入長度限制,程序會直接崩潰掉,在高版本的Android SDK中這個問題已經改了,如果出現上面的情況會直接清空輸入框中的內容,爲了避免這種討厭的問題,我們可以屏蔽EditText的複製和粘貼功能,只需要屏蔽EditText的長按響應即可:


/**

     * 屏蔽複製、粘貼功能

     *

     * */

    mInputEditTxt.setCustomSelectionActionModeCallback(newActionMode.Callback(){

        publicbooleanonCreateActionMode(ActionModeactionMode,Menumenu){

            returnfalse;

        }

        publicbooleanonPrepareActionMode(ActionModeactionMode,Menumenu){

            returnfalse;

        }

        publicbooleanonActionItemClicked(ActionModeactionMode,MenuItemmenuItem){

            returnfalse;

        }

        @Override

        publicvoidonDestroyActionMode(ActionModemode){

        }

    });

    mInputEditTxt.setLongClickable(false);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章