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>
代码已经全部贴上了。
相关文章推荐
- android动画详解五 layout,插值与评估器
- Android ProgressBar 样式大全
- android studio 2.1 preview4 之 gradle插件问题
- 内部Handler类引起内存泄露
- AndroidStudio中代码混淆以及打包操作
- Android ORM应用开发框架KJFrameForAndroid使用详解
- Android初试--Android中的ContentProvider(3)
- 给TextView加背景
- Android M上VideoCall中Audio的管理(2016.05.27 新增CallsManager部分)
- android 获得当前进程的名字
- Android.Camera2相机超详细讲解
- mac下安装genymotion android模拟器
- Android_PopupWindow提示框
- Android开发环境的搭建
- Android中的MVP
- android layout,measure,draw资料收集
- 如何通过PC端连接Android设备进行adb调试
- android framework源码目录介绍
- Android 省市区三级联动
- 将android项目打成第三方jar包