【笔记】Edittext禁用软键盘,但不影响其他功能

原创 2015年07月10日 11:25:50

最近遇到一个需求,就是需要禁用Edittext的软键盘弹出,但是又不能影响,光标显示和复制粘贴功能。

一般情况下,禁用软件盘的话,只要在Edittext的XML布局文件中加入

android:focusable="false"

但是,这虽然实现了不弹出软键盘,可以使用自定义键盘的需求,却带来别的问题:光标不见了,不能复制粘贴了!虽然自己写一个复制粘贴的方法并不难,但是在发现微信电话本居然可以实现这样的功能之后,我觉得还是使用其自带功能更稳妥,所以积极寻求,有没有什么方法可以使禁用软件盘和Edittext的自带功能不冲突。

我到处找解决方案,虽然找到和我有类似需求的,但尝试后结果不尽如人意,在edittext获取到焦点之后,软件盘还是会弹出。也有想过直接监听并重写onFocus,软件盘虽然能收回,但是还是会在页面中一闪而过,这显然是不符合要求的。

最后是在CSDN中找到了可以实现的方法:

public void hideSoftInputMethod(EditText ed) {
		getActivity().getWindow().setSoftInputMode(
				WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

		int currentVersion = android.os.Build.VERSION.SDK_INT;
		String methodName = null;
		if (currentVersion >= 16) {
			// 4.2
			methodName = "setShowSoftInputOnFocus";
		} else if (currentVersion >= 14) {
			// 4.0
			methodName = "setSoftInputShownOnFocus";
		}
		if (methodName == null) {
			ed.setInputType(InputType.TYPE_NULL);
		} else {
			Class<EditText> cls = EditText.class;
			Method setShowSoftInputOnFocus;
			try {
				setShowSoftInputOnFocus = cls.getMethod(methodName,
						boolean.class);
				setShowSoftInputOnFocus.setAccessible(true);
				setShowSoftInputOnFocus.invoke(ed, false);
			} catch (NoSuchMethodException e) {
				ed.setInputType(InputType.TYPE_NULL);
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		}
	}

其实,我发现,这比我一开始尝试的方案仅仅多了一个兼容性问题,4.2以上的系统和4.0到4.2以下系统之间的一个方法名变了!!!我之前一直是使用的setShowSoftInputOnFocus,而我的测试机是4.0.4的系统,还是会弹出软键盘,所以点击移动光标位置的时候还是会弹出软键盘!

最后,就是实现在光标指定位置插入或删除字符了:

/**
	 * 删除字符
	 */
	private void deleteNumber() {
		// TODO Auto-generated method stub
//		String text = edt_number.getText().toString().trim();
//		int locationStart = edt_number.getSelectionStart();
//		Logger.i("deleteNumber", "locationStart="+locationStart);
//		String start=text.substring(0, locationStart-1);
//		String end="";
//		if (text != null && text.length() > 1) {
//			if (locationStart<text.length()) {
//				end=text.substring(locationStart, text.length());
//			}
//			edt_number.setText(start+end);
//			edt_number.setSelection(locationStart - 1);
//		} else {
//			edt_number.setText("");
//		}
		int index = edt_number.getSelectionStart();  
		Editable editable = edt_number.getText();  
		editable.delete(index-1, index);  
	}
/**
* 设置et_number输入的数字
 * 
 * @param number
 */
private void setSearchNumber(String number) {
int startIndex = edt_number.getSelectionStart();
int endIndex = edt_number.getSelectionEnd();
Logger.i("setSearchNumber", "startIndex="+startIndex+",endIndex="+endIndex);
Editable editable = edt_number.getText();  
editable.insert(startIndex, number); 
}

这里面包含的两种方法,注释掉的是我一开始写的方法,过于繁琐,之后又在网上找到了一个更简便的方法,使用Editable只要三行就能搞定!


参考链接:

http://blog.csdn.net/centralperk/article/details/8548075

http://bbs.csdn.net/topics/360072233

jeesite上传附件总是JS报错但不影响功能(已解决)

最近做政府厂里的中小型项目,要用到client,避免每个js报错,不然有弹框显示,因为这个原因,上传附件那个就是个坑,一直报错,但不影响功能。 上传附件一直报错 于是我就短暂时间的遇坑找坑 最后还想用...

EditText不自动获得输入焦点(以及 获得焦点但不弹出输入法软键盘的方法)

相信被“EditText自动获得焦点”这个问题困扰的同学,实际上是被“EditText自动获得焦点,引发弹出软键盘"这个问题困扰。 如果是被软键盘问题困扰,请看:android:windowSoftI...
  • wkw1125
  • wkw1125
  • 2015年09月13日 13:01
  • 2683

Android软键盘弹出不影响布局的方法

【转载】http://geyubin.iteye.com/blog/1297637 在原有的基础上根据原始文档的说明,对其中的翻译进行了修订,以便读起来更顺畅,更容易理解。 attri...

EditText不自动获得输入焦点(以及 获得焦点但不弹出输入法软键盘的方法)

http://m.blog.csdn.net/article/details?id=48414821 相信被“EditText自动获得焦点”这个问题困扰的同学,实际上是被“EditText自动获得焦...

Android软键盘弹出不影响布局的方…

The AndroidManifest.xml File android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", "s...

Android软键盘弹出不影响布局的方法

Android软键盘弹出不影响布局的方法 博客分类: android   The AndroidManifest.xml File android:windowSo...
  • juishi
  • juishi
  • 2013年05月21日 20:25
  • 1026

Android软键盘弹出不影响布局的方法

The AndroidManifest.xml File android:windowSoftInputMode=["stateUnspecified", "stateUnchanged"...

Android EditText软键盘监听事件以及自动补全功能

EditText常用属性,软键盘监听事件以及输入自动补全功能

EditText不使用系统软键盘(但是不印象其他功能,通过反射)

最近在看EditText的源码,有人问到如果不使用系统的软键盘,在网上看了下资料,发现对于这个问题的解决都比较的浅薄,没有深入到源码层面。 都是通过设置activity中软键盘设置,或者是设置Ed...

报错,但不影响运行ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2

eclipse 3.4+jdk1.6 编译正常通过,运行debug模式时报错 ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv(...
  • zxl0016
  • zxl0016
  • 2012年03月07日 00:03
  • 47845
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【笔记】Edittext禁用软键盘,但不影响其他功能
举报原因:
原因补充:

(最多只允许输入30个字)