顯示多行的文本框,需要可以上下滾動,可復制內容,不可編輯。
使用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);