1. 程式人生 > >Android 禁止Edittext彈出系統軟鍵盤 的幾種方法

Android 禁止Edittext彈出系統軟鍵盤 的幾種方法

第一種方法:在XML檔案下新增:
android:focusable="true"   
android:focusableInTouchMode="true"

第二種方法:直接關閉輸入法

在onCreate中加上:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

第三中方法:在Edittext中設定
.setInputType(InputType.TYPE_NULL);

但是會實現效果,但是會導致游標也無法顯示,如果想顯示游標,你就需要定義一個方法,在方法內setInputType(禁止)
public void disableShowInput(){
if (android.os.Build.VERSION.SDK_INT <= 10){
editText.setInputType(InputType.TYPE_NULL);
}else {
Class<EditText> cls = EditText.class;
Method method;
try {
method = cls.getMethod("setShowSoftInputOnFocus",boolean.class);
method.setAccessible(true);
method.invoke(editText,false)
}catch (Exception e) {//TODO: handle exception
}
try {
method = cls.getMethod("setSoftInputShownOnFocus",boolean.class);
method.setAccessible(true);
method.invoke(editText,false);
}catch (Exception e) {//TODO: handle exception
} } }


這時 你會發現,游標是出來了 但是輸入文字,游標永遠在前面,怎麼辦,解決思路,監聽文字文字內容變化監聽方法,在afterTextChanged文字輸入完後,把游標移到最後.setSelection(Edittext,Edittext.length());看程式碼:
Edittext.addTextChangedListener(watcher);
private TextWatcher watcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
Edittext.setSelection(Edittext,Edittext.length());
}
};


附加:重寫Edittext 在輸入框內增加刪除文字按鈕,就是在Android系統的輸入框右邊加入一個小圖示,點選小圖示可以清除輸入框裡面的內容具體看程式碼:
  1. import android.content.Context;  
  2. import android.graphics.drawable.Drawable;  
  3. import android.text.Editable;  
  4. import android.text.TextWatcher;  
  5. import android.util.AttributeSet;  
  6. import android.view.MotionEvent;  
  7. import android.view.View;  
  8. import android.view.View.OnFocusChangeListener;  
  9. import android.view.animation.Animation;  
  10. import android.view.animation.CycleInterpolator;  
  11. import android.view.animation.TranslateAnimation;  
  12. import android.widget.EditText;  
  13. publicclass RMEditText extends EditText implements
  14.         OnFocusChangeListener, TextWatcher {   
  15.     /** 
  16.      * 刪除按鈕的引用 
  17.      */
  18.     private Drawable mClearDrawable;   
  19.     /** 
  20.      * 控制元件是否有焦點 
  21.      */
  22.     privateboolean falg;  
  23.     public ClearEditText(Context context) {   
  24.         this(context, null);   
  25.     }   
  26.     public ClearEditText(Context context, AttributeSet attrs) {   
  27.         //這裡構造方法也很重要,不加這個很多屬性不能再XML裡面定義
  28.         this(context, attrs, android.R.attr.editTextStyle);   
  29.     }   
  30.     public ClearEditText(Context context, AttributeSet attrs, int defStyle) {  
  31.         super(context, attrs, defStyle);  
  32.         init();  
  33.     }  
  34.     privatevoid init() {   
  35.         //獲取EditText的DrawableRight,假如沒有設定我們就使用預設的圖片
  36.         mClearDrawable = getCompoundDrawables()[2];   
  37.         if (mClearDrawable == null) {   
  38. //          throw new NullPointerException("You can add drawableRight attribute in XML");
  39.             mClearDrawable = getResources().getDrawable(R.drawable.delete_selector);   
  40.         }     
  41.         mClearDrawable.setBounds(00, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());   
  42.         //預設設定隱藏圖示
  43.         setClearIconVisible(false);   
  44.         //設定焦點改變的監聽
  45.         setOnFocusChangeListener(this);   
  46.         //設定輸入框裡面內容發生改變的監聽
  47.         addTextChangedListener(this);   
  48.     }   
  49.     /** 
  50.      * 因為我們不能直接給EditText設定點選事件,所以我們用記住我們按下的位置來模擬點選事件 
  51.      * 當我們按下的位置 在  EditText的寬度 - 圖示到控制元件右邊的間距 - 圖示的寬度  和 
  52.      * EditText的寬度 - 圖示到控制元件右邊的間距之間我們就算點選了圖示,豎直方向就沒有考慮 
  53.      */
  54.     @Override
  55.     publicboolean onTouchEvent(MotionEvent event) {  
  56.         if (event.getAction() == MotionEvent.ACTION_UP) {  
  57.             if (getCompoundDrawables()[2] != null) {  
  58.                 boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())  
  59.                         && (event.getX() < ((getWidth() - getPaddingRight())));  
  60.                 if (touchable) {  
  61.                     this.setText("");  
  62.                 }  
  63.             }  
  64.         }  
  65.         returnsuper.onTouchEvent(event);  
  66.     }  
  67.     /** 
  68.      * 當ClearEditText焦點發生變化的時候,判斷裡面字串長度設定清除圖示的顯示與隱藏 
  69.      */
  70.     @Override
  71.     publicvoid onFocusChange(View v, boolean hasFocus) {   
  72.         this.falg = hasFocus;  
  73.         if (hasFocus) {   
  74.             setClearIconVisible(getText().length() > 0);   
  75.         } else {   
  76.             setClearIconVisible(false);   
  77.         }   
  78.     }   
  79.     /** 
  80.      * 設定清除圖示的顯示與隱藏,呼叫setCompoundDrawables為EditText繪製上去 
  81.      * @param visible 
  82.      */
  83.     protectedvoid setClearIconVisible(boolean visible) {   
  84.         Drawable right = visible ? mClearDrawable : null;   
  85.         setCompoundDrawables(getCompoundDrawables()[0],   
  86.                 getCompoundDrawables()[1], right, getCompoundDrawables()[3]);   
  87.     }   
  88.     /** 
  89.      * 當輸入框裡面內容發生變化的時候回撥的方法 
  90.      */
  91.     @Override
  92.     publicvoid onTextChanged(CharSequence s, int start, int count,   
  93.             int after) {   
  94.                 if(falg){  
  95.                     setClearIconVisible(s.length() > 0);  
  96.                 }  
  97.     }   
  98.     @Override
  99.     publicvoid beforeTextChanged(CharSequence s, int start, int count,   
  100.             int after) {      
  101.     }   
  102.     @Override
  103.     publicvoid afterTextChanged(Editable s) {      
  104.     }     
  105. }  
在xml檔案中這樣用
  1.  <com.example.edittext.RMEditText
  2.         android:hint="輸入文字"
  3.         android:layout_width="fill_parent"
  4.         android:layout_height="wrap_content" >
  5.     </>
  6. 1
  • setClearIconVisible()方法,設定隱藏和顯示清除圖示的方法,呼叫setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)來設定上下左右的圖示
  • setOnFocusChangeListener(this) 為輸入框設定焦點改變監聽,如果輸入框有焦點,我們判斷輸入框的值是否為空,為空就隱藏清除圖示,否則就顯示它
  • addTextChangedListener(this) 為輸入框設定內容改變監聽,其實很簡單呢,當輸入框裡面的內容發生改變的時候,我們需要處理顯示和隱藏清除小圖示,裡面的內容長度不為0我們就顯示,否是就隱藏,但這個需要輸入框有焦點我們才改變顯示或者隱藏,為什麼要需要焦點,比如我們一個登陸介面,我們儲存了使用者名稱和密碼,在登陸介面onCreate()的時候,我們把我們儲存的密碼顯示在使用者名稱輸入框和密碼輸入框裡面,輸入框裡面內容發生改變,導致使用者名稱輸入框和密碼輸入框裡面的清除小圖示都顯示了,這顯然不是我們想要的效果,所以加了一個是否有焦點的判斷這塊可以參考http://blog.csdn.net/xiaanming/article/details/11066685/# 這篇文章,還有動畫效果等。