IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

张明云的博客 2016-04-02 13:23:15 累计浏览 2,141 次
本机暂存

  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);

同分类推荐文章

  1. 「置顶」我做了什么 (2026-05-05 12:13:28)
  2. 万字长文推演:手机不再从 App 开始,Agent OS 如何接管任务入口 (2026-04-28 14:57:22)
  3. Android Perfetto 系列 10 - Binder 调度与锁竞争 (2025-11-16 15:33:30)

查看更多 移动开发 文章 →

建议继续学习

  1. 情绪版(Mood board)操作流程的新思考 (累计阅读 41,754)
  2. android 开发入门 (累计阅读 19,529)
  3. Android 连接SSID隐藏网络以及 LEAP 认证的方法 (累计阅读 9,539)
  4. 让安卓手机通过代理翻墙的方法 (累计阅读 9,117)
  5. 手机产品设计方向 (累计阅读 7,954)
  6. 实时监控Android设备网络封包 (累计阅读 6,558)
  7. Eclipse开发Android应用程序入门:重装上阵 (累计阅读 6,462)
  8. 基于 PhoneGap 与 Java 开发的 Android 应用的性能对比 (累计阅读 6,411)
  9. Android用户界面设计:表格布局 (累计阅读 6,186)
  10. Windows下使用VMware安装Android (累计阅读 5,633)