Android实现搜索框代码如下
需要在attrs文件中添加如下代码:
<declare-styleable name="EtSearchTextView">
<attr name="serachSrc" format="reference"></attr>
<attr name="serachDeleteSrc" format="reference"></attr>
<attr name="searchSrcHeight" format="dimension"></attr>
<attr name="searchDeleteSrcHeight" format="dimension"></attr>
</declare-styleable>
自定义view的实现
public class EtSearchTextView extends android.support.v7.widget.AppCompatEditText implements
View.OnFocusChangeListener , TextWatcher , TextView.OnEditorActionListener{
private static final String TAG = "EtSearchTextView";
private Drawable mSearchDrawable , mDeleteDrawable;//搜索和删除图标
private float searchSize = 0 , deleteSize = 0;//设置搜索,删除图标的大小
private OnClickSearchListener mOnClickSearchListener;
private int mTouchSlop;//发生滑动的最小距离,
public EtSearchTextView(Context context) {
this(context , null);
}
public EtSearchTextView(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.editTextStyle);
}
public EtSearchTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray ta = context.obtainStyledAttributes(attrs , R.styleable.EtSearchTextView);
searchSize = ta.getDimension(R.styleable.EtSearchTextView_searchSrcHeight , 30);
deleteSize = ta.getDimension(R.styleable.EtSearchTextView_searchDeleteSrcHeight , 30);
mSearchDrawable = ta.getDrawable(R.styleable.EtSearchTextView_serachSrc);
mDeleteDrawable = ta.getDrawable(R.styleable.EtSearchTextView_serachDeleteSrc );
setImeOptions(EditorInfo.IME_ACTION_SEARCH);
init();
}
private void init(){
ViewConfiguration configuration = ViewConfiguration.get(getContext());
mTouchSlop = configuration.getScaledTouchSlop();
if(mSearchDrawable != null){
mSearchDrawable.setBounds( 0 , 0 , (int)searchSize ,
(int)searchSize);
}
if(mDeleteDrawable != null){
mDeleteDrawable.setBounds( 0 , 0 , (int)deleteSize ,
(int)deleteSize);
}
showDeleteIcon(false);
setOnFocusChangeListener(this);
addTextChangedListener(this);
}
public void showDeleteIcon(boolean isShow){
Drawable deleteDrawable = isShow ? mDeleteDrawable : null;
setCompoundDrawables(mSearchDrawable , getCompoundDrawables()[1] , deleteDrawable ,
getCompoundDrawables()[3]);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(!(s.toString()).isEmpty()){
showDeleteIcon(true);
}else{
showDeleteIcon(false);
}
}
@Override
public void afterTextChanged(Editable s) {
}
private float xDown , yDown;
private float xUp , yUp;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
xDown = event.getX();
yDown = event.getY();
break;
case MotionEvent.ACTION_UP:
yUp = event.getY();
xUp = event.getX();
//我这里是直接写死了,当然也可以自己定义一个属性传过来用来触发点击事件
if(xUp < 100 && xDown < 100 && Math.abs(xDown - xUp) < mTouchSlop){
QBLogUtils.e(TAG , "搜索点击了");
if(mOnClickSearchListener != null){
mOnClickSearchListener.clickSearch(getText().toString().trim());
}
return true;
}else if(xUp > (getWidth() - 100) && xDown > (getWidth() - 100)
&& Math.abs(xDown - xUp) < mTouchSlop && getCompoundDrawables()[2] != null){
setText("");
return true;
}
break;
}
return super.onTouchEvent(event);
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
QBLogUtils.e(TAG , "hasFocus : " + hasFocus);
if(hasFocus){
}else{
}
}
public void setmOnClickSearchListener(OnClickSearchListener mOnClickSearchListener) {
this.mOnClickSearchListener = mOnClickSearchListener;
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(actionId == EditorInfo.IME_ACTION_SEARCH){
if(mOnClickSearchListener != null){
mOnClickSearchListener.clickSearch(getText().toString().trim());
}
}
return false;
}
public interface OnClickSearchListener{
void clickSearch(String searchStr);
}
}