前段时间用到这样一个效果:开始的时候直接使用相对布局来实现的ps好多地方都有用到,当然也就写了很多。。。后来优化代码的时候试着用组合组件的方式去搞定【觉得还可以再优化】,下午第二次优化的时候决定用自定义EditTextView来实现这个效果
开发步骤:
1:继承EditTextView
package org.droidparts.sample.widget;
import org.droidparts.sample.R;
import org.droidparts.sample.widget.EditTextListener.TextWatchListener;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.EditText;
/**
* editTextView = (ClearableEditView) findViewById(R.id.clearEdit); editTextView.setDrawableClickListener(new
* ClearableRighrListener() {
*
* @Override public void onDrawableClickListener() { Toast.makeText(DemoActivity.this, "删除了信息", 1).show(); } });
*
*/
public class ClearableEditView extends EditText implements TextWatchListener {
// 右侧显示的图片
Drawable mDrawable;
// 操作右侧图片的对外接口
ClearableRighrListener listener;
public interface ClearableRighrListener {
void onDrawableClickListener();
}
public void setDrawableClickListener(ClearableRighrListener listener) {
this.listener = listener;
}
/**
* @param context
* @param attrs
*/
public ClearableEditView(Context context, AttributeSet attrs) {
super(context, attrs);
// 初始化
init();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 点击右侧图片进行事件处理
if (getCompoundDrawables()[2] != null) {
// 确定是否点击的是右侧图片
boolean isClear = event.getX() > (getWidth() - getPaddingRight() - mDrawable
.getIntrinsicWidth());
if (isClear) {
if (MotionEvent.ACTION_UP == event.getAction()) {
if (listener != null) {
setText("");
listener.onDrawableClickListener();
}
}
return true;
}
}
return super.onTouchEvent(event);
}
/**
*
*/
private void init() {
// 得到右侧图片
mDrawable = getCompoundDrawables()[2];
if (mDrawable == null) {
mDrawable = getResources().getDrawable(R.drawable.ic_launcher);
}
mDrawable.setBounds(0, 0, mDrawable.getIntrinsicWidth(),
mDrawable.getIntrinsicHeight());
setClearIconVisible(false);
// 添加ed的监听
addTextChangedListener(new EditTextListener(this));
}
/**
* @param b
*/
private void setClearIconVisible(boolean b) {
Drawable drawable = b ? mDrawable : null;
setCompoundDrawables(getCompoundDrawables()[0],
getCompoundDrawables()[1], drawable, getCompoundDrawables()[3]);
}
// ed内容变化的回调
@Override
public void onWatchListener(String str) {
if (isFocusable()) {
setClearIconVisible(!TextUtils.isEmpty(str));
}
}
}
补充下自定义的textWatch
package org.droidparts.sample.widget;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
public class EditTextListener implements TextWatcher {
EditText mEditText;
TextWatchListener listener;
public interface TextWatchListener {
void onWatchListener(String str);
}
/**
*
*/
public EditTextListener(TextWatchListener listener) {
this.listener = listener;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (listener != null) {
listener.onWatchListener(s.toString());
}
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
}
过程其实比较简单,通过getCompoundDrawables()获取到我们制定位置的图片,给它设置图片,然后监听ED的内容变化来控制图片的显隐,最重要的就是怎么去监听点击图片的事件。。这里通过点击的位置来判断是否点击了图片,如果点击了图片则通过对用的回调来处理
用法如下:
xml文件
<org.droidparts.sample.widget.ClearableEditView
android:id="@+id/clearEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="@drawable/ic_launcher"
/>
Activity或者Fragment中处理事件:
editTextView = (ClearableEditView) findViewById(R.id.clearEdit);
editTextView.setDrawableClickListener(new ClearableRighrListener() {
@Override
public void onDrawableClickListener() {
Toast.makeText(DemoActivity.this, "删除了信息", 1).show();
}
});
其实一个效果可以通过多种路径去实现,我们的目的是写最少的代码做最多的事情,提高代码的重用