Benutzerdefinierter EditText mit drei Schaltflächen auf der rechten Seite

Während der Entwicklung einer Anwendung wollte ich der EditText-Komponente eine Klartext-Schaltfläche hinzufügen. Die Lösung wurde schnell genug gefunden und bestand darin, die Koordinaten der Berührung abzufangen. Wenn die Berührung über dem rechten Hintergrundbild (drawableRight) stattgefunden hat, verarbeiten Sie sie als Tastenklick (Klartext), ansonsten - wie für diese Komponente üblich.

Die Lösung erwies sich als sehr präzise und zuverlässig. Aber dann wollte ich noch weiter gehen und 2-3 Schaltflächen machen, man weiß nie, welche anderen Funktionen man daran hängen kann, zum Beispiel eine Auswahl aus der Liste, die in einem separaten Fenster geöffnet wird, oder den Bearbeitungsmodus aktivieren / deaktivieren, um das Feld vor versehentlichen Änderungen zu schützen.

Beginnen wir also wie folgt:
1. Erstellen Sie ein neues Projekt mit einer leeren Aktivität (Entwicklungsumgebung Android Studio 1.5.1).

2. Fügen Sie eine neue Klasse hinzu und nennen Sie sie MyCustomEditText, vollständige Liste:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
public class MyCustomEditText extends EditText {
    Bitmap drawableRight; //стандартный drawable справа
    Bitmap drawableRight2; //то, ЧТО будем рисовать
    Bitmap drawableRight3; //то, ЧТО будем рисовать
    Paint paint; //то, ЧЕМ будем рисовать
    public MyCustomEditText(Context context) {
        super(context);
        init();
    }
    public MyCustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        initDrawables(attrs);
        init();
    }
    public MyCustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initDrawables(attrs);
        init();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (drawableRight != null) {
            //рисуем drawableRight2 только при наличии drawableRight
            if (drawableRight2 != null) {
                canvas.drawBitmap(drawableRight2, getWidth() + getScrollX() - drawableRight.getWidth() * 2, (getHeight() - drawableRight2.getHeight()) / 2, paint);
                //рисуем drawableRight3 только при наличии drawableRight2
                if (drawableRight3 != null) {
                    canvas.drawBitmap(drawableRight3, getWidth() + getScrollX() - drawableRight.getWidth() * 3, (getHeight() - drawableRight3.getHeight()) / 2, paint);
                }
            }
        }
    }
    /**
     * Returns the right padding of the view, plus space for the right
     * Drawable if any.
     */
    @Override
    public int getCompoundPaddingRight() {
        //здесь мы устанавливаем отступ справа, чтобы каретка не наезжала на наши кнопки
        int paddingRight = super.getCompoundPaddingRight();
        if (drawableRight2 != null) {
            paddingRight = paddingRight + drawableRight2.getWidth();
        }
        if (drawableRight3 != null) {
            paddingRight = paddingRight + drawableRight3.getWidth();
        }
        return paddingRight;
    }
    private void initDrawables(AttributeSet attrs) {
        //инициализируем наши drawables, если были заполнены соответствующие атрибуты
        for (int i = 0; i < attrs.getAttributeCount(); i++) {
            if (attrs.getAttributeName(i).equals("drawableRight")) {
                drawableRight = BitmapFactory.decodeResource(getResources(), attrs.getAttributeResourceValue(i, 0));
            }
            if (attrs.getAttributeName(i).equals("drawableRight2")) {
                drawableRight2 = BitmapFactory.decodeResource(getResources(), attrs.getAttributeResourceValue(i, 0));
            }
            if (attrs.getAttributeName(i).equals("drawableRight3")) {
                drawableRight3 = BitmapFactory.decodeResource(getResources(), attrs.getAttributeResourceValue(i, 0));
            }
        }
    }
    private void init() {
        paint = new Paint();
    }
}

3. Damit unsere Komponente die Eigenschaften hat, die wir benötigen, erstellen Sie attrs.xml mit den folgenden Inhalten:


4. Anschließend können Sie die Werte dieser Eigenschaften in der Markup-Datei festlegen:


5. Nun, der letzte Schritt ist das Hinzufügen der Ereignisbehandlungsroutine onTouchListener in der Hauptaktivität, deren vollständige Auflistung unten aufgeführt ist:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyCustomEditText customEditText = (MyCustomEditText) findViewById(R.id.customEditText);
        customEditText.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    MyCustomEditText editText = (MyCustomEditText) v;
                    //подразумеваем, что все 3 изображения справа указаны
                    //и т.к. все изображения у нас одного размера, то будем отталкиваться от размера самого правого
                    int drawableSize = editText.getCompoundDrawables()[2].getBounds().width();
                    if (event.getRawX() >= editText.getRight() - drawableSize) {
                        Log.i("sdf", "one");
                        return true;
                    } else if (event.getRawX() >= editText.getRight() - drawableSize * 2) {
                        Log.i("sdf", "two");
                        return true;
                    } else if (event.getRawX() >= editText.getRight() - drawableSize * 3) {
                        Log.i("sdf", "three");
                        return true;
                    } else {
                        return false;
                    }
                } else {
                    return false;
                }
            }
        });
    }
}

Das gesamte Projekt kann hier heruntergeladen werden . Ich hoffe, jemand ist hilfreich, danke für Ihre Aufmerksamkeit.

Jetzt auch beliebt: