Android AutoCompleteTextView 增加刪除按鈕清除內容
AutoCompleteTextView 是android 官方的控制元件,比edittext好用,功能也更強大,主要是用於完成輸入框的歷史記錄和人性化的提示功能。但沒有右邊X按鈕清除功能,所以只能自己新增,網上很多都是自定義一個,對於已經加入AutoCompleteTextView 的同學,更換也很麻煩,其實只需要java程式碼設定一下也可以實現,邏輯不太完善的多包涵。
直接上圖:
private AutoCompleteTextView mCommodity_actv;
private InputMethodManager m;
mCommodity_actv.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
if(s.length()==0){
mCommodity_actv.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.search), null, null, null);
//注意剛開始使用的是setCompoundDrawables方法就沒有用,不知道為什麼
mCommodity_actv.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.search), null, getResources().getDrawable(R.drawable.searchclear), null);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
mCommodity_actv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
m=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(mCommodity_actv.isFocused()){
m.showSoftInput(mCommodity_actv, InputMethodManager.SHOW_FORCED);
}
//可以獲得上下左右四個drawable,右側排第二。圖示沒有設定則為空。
Drawable rightIcon = mCommodity_actv.getCompoundDrawables()[DRAWABLE_RIGHT];
if (rightIcon != null && event.getAction() == MotionEvent.ACTION_UP) {
//檢查點選的位置是否是右側的刪除圖示
//注意,使用getRwwX()是獲取相對螢幕的位置,getX()可能獲取相對父元件的位置
int leftEdgeOfRightDrawable = mCommodity_actv.getRight() - mCommodity_actv.getPaddingRight()
- rightIcon.getBounds().width();
if (event.getRawX() >= leftEdgeOfRightDrawable) {
mCommodity_actv.setText("");
}
}
return true;
}
});
紅色部分我開始沒有加,導致不能彈出輸入法,原因是:mCommodity_actv.setOnTouchListener 後就會出現這樣的問題。(注意)
當然你也可以控制關閉方法是:
if(m.isActive(mCommodity_actv)){
m.hideSoftInputFromWindow(mCommodity_actv.getWindowToken(), 0);
}