显示多行的文本框,需要可以上下滚动,可复制内容,不可编辑。
使用TextView,可以实现上下滚动和不可编辑,没有办法实现复制内容的功能
于是决定使用EditText来实现。
在转到使用EditText时,碰到一个问题,因为默认EditText都有长按复制功能。可我的不行。
调查后发现,是因为这一句:
blockText.setMovementMethod(ScrollingMovementMethod.getInstance());
这一句用在TextView中,是使其可以上下滚动。EditText默认就是可以多行并且上下滚动。
去掉这一句,就可以恢复EditText的长按复制功能。
使用EditText要实现目标就要使其不可编辑,同时不要弹出软键盘。
在xml文件中可以轻松定义,android:editable="false",可是我是动态生成的EditText,没有相应的set方法。
爬文一下,解决方案不少。
第一种:
设置EditText显示的文本后,调用setFocusable()方法,将参数设为false。
这种方案,没有办法进行复制操作。
第二种:
设置EditText显示的文本后,
blockText.setFilters(new InputFilter[] { new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start,
int end, Spanned dest, int dstart, int dend) {
return source.length() < 1 ? dest.subSequence(dstart, dend) : "";
}
} });
效果很不错,不过点击文本框或长按会显示软键盘。
添加下面的代码:
blockText.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
InputMethodManager manager = (InputMethodManager)context.getSystemService(INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(blockText.getWindowToken(), 0);
}
});
blockText.setOnLongClickListener(new OnLongClickListener(){
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
InputMethodManager manager = (InputMethodManager)context.getSystemService(INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(blockText.getWindowToken(), 0);
return false;
}
});
没有效果,软键盘还在,不明白原因,是因为权限设定问题吗?
又试了下面的代码:
blockText.setOnFocusChangeListener(new OnFocusChangeListener(){
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus==true) {
Log.e("onFocusChange", "hasFocus==true");
hideIM(v);
}
}
});
blockText.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN) {
Log.e("onTouch", "MotionEvent.ACTION_DOWN");
hideIM(v);
}
return false; // dispatch the event further!
}
});
private void hideIM(View edt) {
// try to hide input_method:
try {
InputMethodManager im = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
IBinder windowToken = edt.getWindowToken();
if (windowToken != null) {
// always de-activate IM
Log.e("windowToken", "windowToken != null");
im.hideSoftInputFromWindow(windowToken, 0);
}
} catch (Exception e) {
Log.e("HideInputMethod", "failed:" + e.getMessage());
}
}
仍然没有效果。不明白为什么。
而且长按后,选择文字,在弹出的软键盘输入文字,虽然因为filter没有办法输入,不过选中的内容会被删掉!
第三种:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
在oncreate中设置,不要弹出软键盘,我把他放到上一种方法的设定软键盘的位置,不工作,我想应该是要在setContext之前吧。
可是因为还有其他文本框会用到软键盘,也就没有再去试。
第四种:
设置EditText显示的文本后,执行下面的方法,
blockText.setInputType(InputType.TYPE_NULL)
运行发现多行变成一行,
blockText.setSingleLine(false);
这样可以。不过长按还是会有有键盘出来。
第五种,最简单
blockText.setKeyListener(null);
与上面的方法效果相同。
一句就可以达到想要的效果,唯一的遗憾就是长按还是有软键盘弹出,而且复制选中内容无底色。
同样效果:
blockText.setKeyListener(new NumberKeyListener() {
public int getInputType() {
return InputType.TYPE_NULL;
}
protected char[] getAcceptedChars() {
return new char[] {};
}
});
如何长按不要打开软键盘?以及给选择内容加底色?
为什么设定关闭软键盘的语句没有作用呢?
=====================================================
其他:
android:windowSoftInputMode="stateHidden" 程式一開始就不會自動顯示軟體鍵盤
1、EditText有焦点(focusable为true)阻止输入法弹出
editText=(EditText)findViewById(R.id.txtBody);
editText.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
editText.setInputType(InputType.TYPE_NULL); // 关闭软键盘
return false;
}
});
2、当EidtText无焦点(focusable=false)时阻止输入法弹出
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);