Android monitors the content changes of EditText

Introduction to this section:

We have already learned the EditText control in the previous section. In this section, we will talk about how to monitor the content changes of the input box! This is very practical in actual development. In addition, I will talk about how to make the password of EditText visible or invisible!


1. Monitor the content changes of EditText

As can be seen from the title, it is an event processing mechanism based on monitoring. It seems that the previous click event is OnClickListener, and the listener for text content changes is: TextWatcher. We can call EditText.addTextChangedListener(mTextWatcher); to set content change monitoring for EditText!

Simply speaking, TextWatcher needs to implement three methods to implement this class:

public void beforeTextChanged(CharSequence s, int start,int count, int after);   
public void onTextChanged(CharSequence s, int start, int before, int count);
public void afterTextChanged(Editable s);

which in turn will be triggered in the following cases:

  • 1. Before content changes
  • 2. The content is changing
  • 3. After content changes

We can rewrite related methods according to actual needs. Generally, the third method is rewritten more!

There are many occasions to monitor the changes of EditText content: limit the number of words input, limit the input content, etc.~

Here is a simple custom EditText for everyone. After entering the content, a crossed circle will be displayed on the side. After the user clicks, the text box can be cleared. Of course, you can also directly add TextWatcher to the EditText and delete it under the settings. button~

Realize the effect diagram:

Custom EditText: DelEditText.java

package demo.com.jay.buttondemo;

import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.EditText;

/**
 * Created by coder-pig on 2015/7/16 0016.
 */
public class DelEditText extends EditText {

    private Drawable imgClear;
    private Context mContext;

    public DelEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        init();
    }

    private void init() {
        imgClear = mContext.getResources().getDrawable(R.drawable.delete_gray);
        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 editable) {
                setDrawable();
            }
        });
    }


    //绘制删除图片
    private void setDrawable(){
        if (length() < 1) 
            setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); 
        else 
            setCompoundDrawablesWithIntrinsicBounds(null, null, imgClear, null); 
    } 


    //When the touch range is on the right, trigger the delete method and hide the fork 
    @ Override 
    public boolean onTouchEvent(MotionEvent event) { 
        if(imgClear != null && event.getAction() == MotionEvent.ACTION_UP) 
        { 
            int eventX = (int) event.getRawX(); 
            int eventY = (int) event.getRawY( ); 
            Rect rect = new Rect(); 
            getGlobalVisibleRect(rect); 
            rect.left = rect.right - 100; 
            if (rect.contains(eventX, eventY)) 
                setText(""); 
        }
        return super.onTouchEvent(event);
    }


    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }

}

Background drawable for EditText: bg_frame_search.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="@color/background_white" />
    <corners android:radius="5dp" />
    <stroke android:width="1px" android:color="@color/frame_search"/>
</shape>

Color resource: color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="reveal_color">#FFFFFF</color>
    <color name="bottom_color">#3086E4</color>
    <color name="bottom_bg">#40BAF8</color>
    <color name="frame_search">#ADAEAD</color>
    <color name="background_white">#FFFFFF</color>
    <color name="back_red">#e75049</color>
</resources>

Layout file: activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/back_red"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <demo.com.jay.buttondemo.DelEditText
        android:id="@+id/edit_search"
        android:layout_width="match_parent"
        android:layout_height="32dp"
        android:layout_margin="10dp"
        android:background="@drawable/bg_frame_search" 
        android:padding="5dp"
        android:hint="EditText with delete button~"
        android:maxLength="20"
        android:singleLine="true" />


</LinearLayout>

PS: The code is very simple, so I won’t explain it~


2. Realize the visible and invisible password of EditText

This is also a very practical requirement, that is, the password in the EditText can be made visible or invisible after the user clicks the button~

Realize the effect diagram:

Implementation code:  activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:layout_margin="5dp"
    android:orientation="horizontal">

    <EditText
        android:id="@+id/edit_pawd"
        android:layout_width="0dp"
        android:layout_weight="2"
        android:layout_height="48dp"
        android:inputType="textPassword"
        android:background="@drawable/editborder"/>

    <Button
        android:id="@+id/btnChange"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="48dp" 
        android:text="password visible"/> 

</LinearLayout>

MainActivity.java

package com.jay.demo.edittextdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText edit_pawd;
    private Button btnChange;
    private boolean flag = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit_pawd = (EditText) findViewById(R.id.edit_pawd);
        btnChange = (Button) findViewById(R.id.btnChange);
        edit_pawd.setHorizontallyScrolling(true);    //设置EditText不换行
        btnChange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(flag == true){
                    edit_pawd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                    flag = false;
                    btnChange.setText("密码不可见");
                }else{
                    edit_pawd.setTransformationMethod(PasswordTransformationMethod.getInstance()); 
                    flag = true;
                    btnChange.setText("Password is visible"); 
                } 
            } 
        }); 
    } 
}

editborder.xml

<?xml version="1.0" encoding="utf-8"?>   
<shape xmlns:android="http://schemas.android.com/apk/res/android">   
  
    <!-- Set transparent background color- ->   
    <solid android:color="#FFFFFF" />   
  
    <!-- Set a white border -->   
    <stroke   
        android:width="1px"   
        android:color="#FFFFFF" />   
    <!-- Set it Margin, make the space bigger -->   
    <padding   
        android:bottom="5dp"   
        android:left="5dp"   
        android:right="5dp"   
        android:top="5dp" />   
  
</shape>

Guess you like

Origin blog.csdn.net/leyang0910/article/details/131251739