Android EditText with custom font and clear button

C’mon, admit it, you’ve always wanted this. Have you ever felt that text clearing in your android application on EditTexts feels… wrong ?

So, what do we want to achive?

Plain and simple, a TextView, based on the same principle as the previous TextView tutorial, with custom fonts (from assets folder) and with a Clear button.

image

Proceed with caution…

  Of course, if you get a request to use custom fonts in you app, this does not apply only to TextViews, but to all items like Buttons, List Items and EditTexts.

First we need to create our own custom control, extending EditText and adding the following:

  • an image resource for the Clear button
  • an TextChangedListener so we only show the Clear button when the EditText contains something
  • method for setting our custom TypeFace
  • TouchListener so we detect if the user taped on the Clear button area.

Our project will contain a few things:

image

  1. Main activity: AndroidTutorialActivity.java
  2. Our custom control: MyEditText
  3. Custom fonts in assets folder
  4. Clear_button_image resource for the button  image
  5. Main.xml as the main layout.

I’ll just post the entire code with comments and I’m sure you’ll understand it in a second:

  
  
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
public class MyEditText extends EditText{
 
     //The image we are going to use for the Clear button
     private Drawable imgCloseButton = getResources().getDrawable(R.drawable.clear_button_image);
     
     public MyEditText(Context context) {
         super (context);
         init();
     }
 
     public MyEditText(Context context, AttributeSet attrs, int defStyle) {
         super (context, attrs, defStyle);
         init();
     }
 
     public MyEditText(Context context, AttributeSet attrs) {
         super (context, attrs);
         init();
     }
     
     void init() {
         
         // Set bounds of the Clear button so it will look ok
         imgCloseButton.setBounds( 0 , 0 , imgCloseButton.getIntrinsicWidth(), imgCloseButton.getIntrinsicHeight());
 
         // There may be initial text in the field, so we may need to display the  button
         handleClearButton();
 
         //if the Close image is displayed and the user remove his finger from the button, clear it. Otherwise do nothing
         this .setOnTouchListener( new OnTouchListener() {
             @Override
             public boolean onTouch(View v, MotionEvent event) {
 
                 MyEditText et = MyEditText. this ;
 
                 if (et.getCompoundDrawables()[ 2 ] == null )
                     return false ;
                 
                 if (event.getAction() != MotionEvent.ACTION_UP)
                     return false ;
                 
                 if (event.getX() > et.getWidth() - et.getPaddingRight() - imgCloseButton.getIntrinsicWidth()) {
                     et.setText( "" );
                     MyEditText. this .handleClearButton();
                 }
                 return false ;
             }
         });
 
         //if text changes, take care of the button
         this .addTextChangedListener( new TextWatcher() {
             @Override
             public void onTextChanged(CharSequence s, int start, int before, int count) {
 
                 MyEditText. this .handleClearButton();
             }
 
             @Override
             public void afterTextChanged(Editable arg0) {
             }
 
             @Override
             public void beforeTextChanged(CharSequence s, int start, int count, int after) {
             }
         });
     }
     
     //intercept Typeface change and set it with our custom font
     public void setTypeface(Typeface tf, int style) {
         if (style == Typeface.BOLD) {
             super .setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/Vegur-B 0.602.otf" ));
         } else {
             super .setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/Vegur-R 0.602.otf" ));
         }
     }
     
     void handleClearButton() {
         if ( this .getText().toString().equals( "" ))
         {
             // add the clear button
             this .setCompoundDrawables( this .getCompoundDrawables()[ 0 ], this .getCompoundDrawables()[ 1 ], null , this .getCompoundDrawables()[ 3 ]);
         }
         else
         {
             //remove clear button
             this .setCompoundDrawables( this .getCompoundDrawables()[ 0 ], this .getCompoundDrawables()[ 1 ], imgCloseButton, this .getCompoundDrawables()[ 3 ]);
         }
     }
}

Don’t forget to add it in your main layout

 

  
  
1
2
3
4
5
6
7
8
9
10
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
     android:layout_width = "fill_parent"
     android:layout_height = "fill_parent"
     android:orientation = "vertical" >
 
     < com.alinberce.app.MyEditText
         android:layout_width = "fill_parent"
         android:layout_height = "wrap_content"
         android:text = "My cool edit text" />
</ LinearLayout >

Run it and see the result:

 

image

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值