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

Android EditText的使用及值得注意的地方的更多相关文章

  1. Android EditText悬浮在输入法之上

    Android EditText悬浮在输入法之上 使用 android:windowSoftInputMode="adjustResize" 会让界面整体被顶上去,很多时候我们不需 ...

  2. Android EditText 不弹出输入法

    当第一次进入一个activity的时候  一般是第一个edittext是默认选中的,但是该死的软键盘也一起弹出来了 那是相当的不美观哈!(#‵′)凸.为此, 本大人就去寻找在刚进入这个activity ...

  3. android EditText获取光标位置并安插字符删除字符

    android EditText获取光标位置并插入字符删除字符1.获取光标位置int index = editText.getSelectionStart(); 2.在光标处插入字符int index ...

  4. Android EditText截获与监听输入事件

      Android EditText截获与监听输入事件共有2种方法: 1.第一种方法:使用setOnKeyListener(),不过这种方式只能监听硬键盘事件. edittext.setOnKeyLi ...

  5. Android EditText不弹出输入法焦点问题的总结

    转自:http://mobile.51cto.com/aprogram-403138.htm 看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的 ...

  6. Android EditText属性

    1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 ( ...

  7. Android EditText自动弹出输入法焦点

    http://mobile.51cto.com/aprogram-403138.htm 1. 看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的 ...

  8. 【Android】Android EditText 去除边框

    [Android]Android EditText 去除边框 将EditText属性设置修改 android:background="@null" //////////////// ...

  9. Android EditText默认不弹出输入法,以及获取光标,修改输入法Enter键的方法

    一.Android EditText默认不弹出输入法的办法:1. 在AndroidManifest.xml中将需要默认隐藏键盘的Activity中添加属性即可(常用此方法) android:windo ...

随机推荐

  1. Asp.net 主题 【2】

    通常我们经常看到网页,一些软件提供换肤功能,各种主题间切换.ASP.NET 2.0 中可以用Theme和skin以及CSS轻松实现这个功能. 首先简单介绍一下三种技术:主题(Theme)技术,面板(s ...

  2. angularJS学习手册(1)

    欢迎来到augularJS的学习 一.什么是angularJS? angular的英文意思是角,为什么要叫angular我也不知道. AngularJS是一个MV*(Model-View-Whatev ...

  3. hibernate_validator_07

    一.校验组序列 默认情况下,约束的验证是没有一定的顺序的,不管他们是属于哪个认证组的.但是在有些环境中,我们控制这些约束验证的顺序还是很有用的. 就拿我们上一个例子来说,我们可以这样:首先在我们检查车 ...

  4. uva 11529 Strange Tax Calculation (几何+计数)

    题目链接: http://vjudge.net/problem/viewProblem.action?id=18277 这题暴力n^4妥妥的TLE!即使n^3也可能会T 正确的姿势应该是:枚举每个点作 ...

  5. 疯狂学习java web4(jsp)

    JSP与PHP.ASP.ASP.NET等语言类似,运行在服务端的语言. JSP(全称Java Server Pages)是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开 ...

  6. 数据库备份工具mysqldump重要参数详解

    1. --single-transaction InnoDB 表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,实际上它的工作原理是设定本次会话的隔离级别为:RE ...

  7. terminal命令

    新建一个文件并写入内容:  echo hello world > a.txt (每次echo都会重写文件) 新建文件: touch a.txt 新建目录: mkdir work 用vim打开文件 ...

  8. PhotoShop 移动工具详解

    自动选择工具 勾选后  可以随意移动任意图层     不勾选  只适用于移动当前所选图层 Ctrl+Z 还原移动Ctrl+Alt+Z 后退一步 复制图像 Alt键+拖动 Shift+Alt+拖动   ...

  9. python对比两个文件问题

    写一个比较两个文本文件的程序. 如果不同, 给出第一个不同处的行号和 列号. 比较的时候可以使用zip()函数 a=open('test.txt','r') b=open('test2.txt','r ...

  10. Http Request Process

    Request---------------->IIS(w3wp.exe)--------------->CLR(AppDomain)-------------------->ASP ...