您的位置:首页 > 移动开发 > Android开发

android自定义View(一):扩展方式(继承)带有预置数据 和 删除键的自定义EditText

2016-03-27 18:05 633 查看

android自定义View(一):扩展方式(继承)带有预置数据 和 删除键的自定义EditText

android不仅提供了多种系统已经设计好的view,而且还支持多种方式自定义view来实现用户的个性化需求,接下来将分别介绍三种自定义view的实现方法,带有简单的实例。

三种自定义view的方式

自定义EditText

三种自定义view的方式

1,扩张方式(继承)--对现有的view控件进行扩展
2,组合方式--把已有的控件重新组合
3,重写(绘制)--通过重新的绘制实现全新的控件


自定义EditText



主要代码如下:

public class MyEditText extends EditText {
Drawable clearDrawable;
Boolean flag = false;
String tempString = "";
Context context;
AttributeSet attrs;

public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
this.attrs = attrs;
init();
}

public MyEditText(Context context, AttributeSet attrs) {
this(context, attrs ,android.R.attr.editTextStyle);
}

public MyEditText(Context context) {
this(context , null);
}

private void init(){
TypedArray ta = context.obtainStyledAttributes(attrs ,R.styleable.myedit);
tempString = ta.getString(R.styleable.myedit_pretext);
ta.recycle();
clearDrawable = getCompoundDrawables()[2];
if(clearDrawable == null){
clearDrawable = getResources().getDrawable(R.drawable.ic_launcher);
}
clearDrawable.setBounds(0, 0, clearDrawable.getIntrinsicWidth(), clearDrawable.getIntrinsicHeight());
}

@Override
protected void onDraw(Canvas canvas) {

System.out.println("-----------MyEditText onDraw ------------");
super.onDraw(canvas);
String textString = getText().toString();
//设置预置数据
if(!flag){
textString =tempString + textString ;
if(textString != null && !textString.equals("null")){
setText(textString);
}

setSelection(getText().length());
flag = true;

}
//设置EditView的四个方向上的图片
if(getText().length()>0){
setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], clearDrawable, getCompoundDrawables()[3]);
}else{
setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], null, getCompoundDrawables()[3]);
}
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP){
if(getCompoundDrawables()[2] != null){
//通过计算 确定点击事件是否在图片上
boolean delete = event.getX() > (getWidth()-getTotalPaddingRight()) && event.getX() <(getWidth()-getPaddingRight());
if(delete){
setText("");
}
}
}

return super.onTouchEvent(event);
}
}


相应的xml布局文件:

<com.melo.learnandroid.defindview.MyEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
custom:pretext = "test:"
android:background="@drawable/edittextselect"/>


接下来就解释一下代码

在xml文件中有

custom:pretext = “test:”这句,当然要用这个还有的有一句声明

在根view上

xmlns:custom=”http://schemas.android.com/apk/res-auto”

这个连个custom是对应的

相应的attrs .xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="myedit">
<attr name="pretext" format="string"/>
</declare-styleable>
</resources>


代码已经全部贴上了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: