zoukankan      html  css  js  c++  java
  • 【转】Android EditText的使用及值得注意的地方

     Android上有很多输入法应用,每种输入法都有各自的特点,输入法多数时候是和EditText配合使用,结合我自己的亲身实践分享一下使用EditText过程中遇到的一些问题及解决方法。

    设置默认输入法

      有时候为了提高用户体验,在弹出输入法时需要设置默认的输入状态,比如单词应用弹出输入法时,输入法最好是在英文输入状态下。如果是字典应用,弹出输入法时最好是在中文输入状态下,Android并没有提供设置默认的输入状态的接口,但我们可以通过如下方法一样能够达到想要的效果:

      默认中文:

    mEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT);
    

      默认英文:

    mEditText.setInputType(EditorInfo.TYPE_TEXT_VARIATION_URI);
    

    打开和关闭输入法

      手动控制输入法的开关状态也能提升用户体验,比如:

    • 有的搜索框会有一个清除按钮,点击清除按钮时就应该弹出输入法,因为用户清除搜索内容的目的多数时候是需要输入新的内容;

    • 执行搜索时应该隐藏输入法,因为显示输入法时会遮挡搜索结果,用户体验不太好;

    • 闹钟来时或者有其它window弹出时应该隐藏输入法,因为输入法也是window,如果不隐藏可能导致输入法遮挡住了其它window等用户体验不太友好的问题。

      打开输入法:

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

      关闭输入法:

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

    监听EditText的输入状态

    • 类似新浪微博,在输入内容时会提示还可以输入多少字;

    • 有的搜索引擎,输入内容时实时显示搜索结果;

    • 有的输入框有输入长度限制,输入内容超过长度限制时弹出提示信息。

      上面这些都可以通过监听EditText的输入状态来实现,具体实现方式如下:

    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("监听EditText输入内容的变化,在这里可以监听输入内容的长度。");
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                System.out.println("这里可以实现所输即所得,用户输入的同时可以立即在这里根据输入内容执行操作,显示搜索结果!");
            }
        });
    

    监听输入法中的回车按钮

      比如搜狗输入法的右下角有一个回车按钮,我们希望用户点击它时也执行确认功能,可以通过监听EditText的按键点击事件来实现:

    /**
         * 监听输入法按键
         * 
         * */
        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("手指弹起时执行确认功能");
                    return true;
                }
    
                return false;
            }
        });
    

    改变输入法中回车按钮的显示内容

      如果回车按钮是执行搜索功能,则回车按钮上显示"搜索",如果是执行发送功能,则显示"发送",如果是下一步,则显示"下一步"。

      实现这个功能需要调用EditText的setImeOptions方法:

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

    限制输入内容

      有时候我们根本就不想用户输入一些杂七杂八的内容,因为这需要程序针对输入的内容做各种处理,如果处理不当还会有好多不可预见的问题,索性在输入内容时就禁止用户输入一些非法字符,这可以通过下面的方式实现,新建一个类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);
        }
        
        /**
         * 检测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时,调用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(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);
    
     


    作者:张明云
    链接:https://www.jianshu.com/p/1f05bb1fde3e
     
  • 相关阅读:
    BZOJ3560: DZY Loves Math V(欧拉函数)
    BZOJ2693: jzptab(莫比乌斯反演)
    洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
    BZOJ3884: 上帝与集合的正确用法(欧拉函数 扩展欧拉定理)
    codeforces757E. Bash Plays with Functions(狄利克雷卷积 积性函数)
    等差数列与等比数列
    Codeforces#498F. Xor-Paths(折半搜索)
    在驱动和应用程序间共享内存
    Documentation/sched-bwc.txt 的中文翻译
    Windows NT 驱动程序开发人员提示 -- 应注意避免的事项
  • 原文地址:https://www.cnblogs.com/ryq2014/p/9024411.html
Copyright © 2011-2022 走看看