More

    Comment Implémenter le Clic sur les Drawables EditText

    Advertisement

    La fonctionnalité drawable dans EditText permet aux développeurs d’ajouter des icônes sur les côtés des champs de saisie Android. Cependant, implémenter le clic sur les drawables d’EditText nécessite une approche spécifique utilisant OnTouchListener. Dans ce guide pratique, vous apprendrez des techniques éprouvées avec du code prêt à l’emploi optimisé pour les meilleures performances et expérience utilisateur.

    Advertisement
    Implémentation du clic drawable EditText Android avec OnTouchListener
    Démonstration du clic drawable EditText montrant une interaction fluide et un retour responsif

    Comprendre les Concepts du Clic Drawable EditText

    L’EditText d’Android supporte le placement de drawables dans quatre positions différentes : start, top, end et bottom. Pour gérer les clics sur ces éléments, vous devez utiliser OnTouchListener car il n’existe pas de méthode onClick dédiée. Cette approche permet la détection précise des coordonnées de toucher et la comparaison avec la zone du drawable.

    En tant que développeur, comprendre le mécanisme du clic drawable EditText est crucial pour créer des expériences utilisateur intuitives. Cette technique est couramment utilisée dans les formulaires de saisie, les champs de recherche et les contrôles numériques des applications Android modernes.

    Advertisement

    Implémentation du Layout XML pour les Drawables

    Premièrement, créez un layout avec EditText ayant des drawables dans les propriétés drawableStart et drawableEnd. Assurez-vous d’avoir ajouté les icônes requises dans le dossier res/drawable avec des tailles et résolutions appropriées.

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp">
    
        <EditText
            android:id="@+id/editText1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:drawableStart="@drawable/ic_baseline_remove_circle_24"
            android:drawableEnd="@drawable/ic_baseline_add_circle_24"
            android:drawablePadding="8dp"
            android:ems="10"
            android:gravity="center_horizontal"
            android:inputType="number"
            android:text="1"
            android:textSize="18sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>

    Configuration d’OnTouchListener dans MainActivity

    Voici l’implémentation complète d’OnTouchListener pour détecter les clics sur les drawables. Utilisez les constantes de position des drawables et calculez les zones de limite de toucher avec précision pour une interaction fiable.

    Advertisement
    public class MainActivity extends AppCompatActivity {
    
        private static final int DRAWABLE_LEFT = 0;
        private static final int DRAWABLE_RIGHT = 2;
        
        @SuppressLint("ClickableViewAccessibility")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            setupDrawableClickListeners();
        }
    
        private void setupDrawableClickListeners() {
            EditText myText = findViewById(R.id.editText1);
            myText.setOnTouchListener((view, motionEvent) -> {
                if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    Drawable[] drawables = myText.getCompoundDrawables();
                    
                    // Détecter le clic sur le drawable end (droite)
                    if (isDrawableClick(motionEvent, myText, drawables, DRAWABLE_RIGHT)) {
                        incrementValue();
                        return true;
                    }
                    
                    // Détecter le clic sur le drawable start (gauche)
                    if (isDrawableClick(motionEvent, myText, drawables, DRAWABLE_LEFT)) {
                        decrementValue();
                        return true;
                    }
                }
                return false;
            });
        }
    
        private boolean isDrawableClick(MotionEvent event, EditText editText, 
                                       Drawable[] drawables, int drawableIndex) {
            if (drawables[drawableIndex] == null) {
                return false;
            }
            
            int drawableWidth = drawables[drawableIndex].getBounds().width();
            float x = event.getRawX();
            
            switch (drawableIndex) {
                case DRAWABLE_RIGHT:
                    return x >= (editText.getRight() - drawableWidth - editText.getPaddingRight());
                case DRAWABLE_LEFT:
                    return x <= (editText.getLeft() + drawableWidth + editText.getPaddingLeft());
                default:
                    return false;
            }
        }
    
        private void incrementValue() {
            EditText myText = findViewById(R.id.editText1);
            try {
                int value = Integer.parseInt(myText.getText().toString());
                myText.setText(String.valueOf(value + 1));
            } catch (NumberFormatException e) {
                myText.setText("1");
            }
        }
    
        private void decrementValue() {
            EditText myText = findViewById(R.id.editText1);
            try {
                int value = Integer.parseInt(myText.getText().toString());
                if (value > 1) {
                    myText.setText(String.valueOf(value - 1));
                }
            } catch (NumberFormatException e) {
                myText.setText("1");
            }
        }
    }

    Articles Récents