Introduction à cette section :

Précédemment, nous avons déjà appris à connaître le contrôle EditText. Dans cette section, nous allons parler de la façon d'écouter les modifications de contenu dans la zone de saisie ! C'est très utile dans le développement réel. De plus, nous aborderons également la façon de rendre le mot de passe EditText visible et invisible. Bon, commençons cette section !


1. Écoute des modifications du contenu d'EditText

Comme le titre l'indique, cela repose sur le mécanisme de gestion des événements des écouteurs. Tout comme l'événement de clic précédent utilise OnClickListener, l'écouteur des modifications du contenu textuel est TextWatcher. Nous pouvons appeler EditText.addTextChangedListener(mTextWatcher); pour configurer un écouteur de modification de contenu pour EditText !

Brièvement sur TextWatcher : pour implémenter cette classe, vous devez implémenter trois méthodes :

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);

Elles sont déclenchées dans l'ordre dans les situations suivantes :

  • 1. Avant les modifications du contenu
  • 2. Pendant les modifications du contenu
  • 3. Après les modifications du contenu

Nous pouvons redéfinir les méthodes pertinentes selon les besoins réels. En général, la troisième méthode est la plus couramment redéfinie !

Il existe de nombreux scénarios d'écoute des modifications du contenu d'EditText : limiter le nombre de mots saisis, restreindre le contenu saisi, etc.~

Nous allons ici implémenter un EditText personnalisé simple. Après avoir saisi du contenu, un cercle avec une croix apparaîtra sur le côté droit. Lorsque l'utilisateur clique dessus, le champ de texte peut être effacé. Bien sûr, vous pouvez aussi ne pas le personnaliser et simplement ajouter un TextWatcher à l'EditText et configurer un bouton de suppression~

Schéma de l'effet d'implémentation :

EditText personnalisé :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);
    }


    //当触摸范围在右侧时,触发删除方法,隐藏叉叉
    @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();
    }

}

Drawable d'arrière-plan de l'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>

Ressource de couleur : 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>

Fichier de mise en page :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:hint="带删除按钮的EditText~"
        android:maxLength="20"
        android:padding="5dp"
        android:singleLine="true" />


</LinearLayout>

PS : Le code est très simple, donc nous ne l'expliquerons pas~


2. Rendre le mot de passe d'un EditText visible et invisible

C'est également une exigence très pratique. C'est-à-dire qu'après que l'utilisateur a cliqué sur un bouton, le mot de passe dans l'EditText peut être rendu visible ou invisible~

Schéma de l'effet d'implémentation :

Code d'implémentation :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="密码可见"/>

</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("密码可见");
                }
            }
        });
    }
}

editborder.xml

<?xml version="1.0" encoding="utf-8"?>  
<shape xmlns:android="http://schemas.android.com/apk/res/android" >  
  
    <!-- 设置透明背景色 -->  
    <solid android:color="#FFFFFF" />  
  
    <!-- 设置一个白色边框 -->  
    <stroke  
        android:width="1px"  
        android:color="#FFFFFF" />  
    <!-- 设置一下边距,让空间大一点 -->  
    <padding  
        android:bottom="5dp"  
        android:left="5dp"  
        android:right="5dp"  
        android:top="5dp" />  
  
</shape> 

Résumé de cette section :

C'est tout pour cette section, merci~