Android 如何讓EditText不可編輯


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM