自定义EditText的两种方法
方法一:
来源:http://blog.csdn.net/ff20081528/article/details/17121911
public class MyEditText extends EditText {
Drawable img;
Context mcontext;
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
mcontext = context;
setBackgroundResource(R.drawable.et_background);
setTextColor(getResources().getColor(R.color.font_black));
setTextSize(16);
img = mcontext.getResources().getDrawable(R.drawable.item_delete_icon);
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (s.length() > 0) {
setCompoundDrawablesWithIntrinsicBounds(null, null, img, null);//设置删除图片
} else {
setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
}
}
});
try {//设置光标颜色
Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
f.setAccessible(true);
f.set((TextView) this, R.drawable.color_cursor);
}catch (Exception e){
}
}
// 处理删除事件
@Override
public boolean onTouchEvent(MotionEvent event) {
if (img != null && event.getAction() == MotionEvent.ACTION_UP) {
//获取点击事件产生的X,Y值
int eventX = (int) event.getRawX();
int eventY = (int) event.getRawY();
Log.e(String.valueOf(mcontext), "eventX = " + eventX + "; eventY = " + eventY);
Rect rect = new Rect();// 定义一个矩形
getGlobalVisibleRect(rect);
rect.left = rect.right - 50;
if(rect.contains(eventX, eventY))//判断点击的X,Y是否在矩形内
setText("");
}
return super.onTouchEvent(event);
}
public MyEditText(Context context) {
super(context);
}
}
方法二:
因为方法一是根据点击事件的X、Y值来定位删除事件的产生的,在运用到自定义对话框的时候位置就有点问题,经过调整感觉还是差那么一点。所以觉得编写另外一种方法来实现。
实现代码
public class mMyEditText extends LinearLayout {
private ImageView img;
private Context mcontext;
private EditText et;
private String hinttext;
public mMyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
mcontext = context;
TypedArray type = context.obtainStyledAttributes(attrs,
R.styleable.myEdittext);
hinttext = type.getString(R.styleable.myEdittext_hint);
LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_myedittext, this);
et = (EditText) findViewById(R.id.et_my);
img = (ImageView) findViewById(R.id.img_my);
et.setHint(hinttext);
DebugLog.e(hinttext);
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (s.length() > 0) {
img.setVisibility(VISIBLE);
} else {
img.setVisibility(GONE);
}
}
});
et.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
et.setText("");
img.setVisibility(GONE);
}
});
}
public mMyEditText(Context context) {
super(context);
}
public String getText(){
return et.getText().toString().trim();
}
}
布局
添加新属性
因为这种方法是通过LinearLayout 来实现的,但是真正应用的时候,LinearLayout 没有hint属性,这时候就要添加属性了
在values目录下新建一个atts文件