右側に3つのボタンがあるカスタムEditText

1つのアプリケーションの開発中に、EditTextコンポーネントにクリアテキストボタンを追加したかったのです。 解決策は十分に迅速に見つかり、タッチの座標をキャッチすることにあり、右の背景画像(drawableRight)でタッチが発生した場合は、ボタンクリック(クリアテキスト)として処理します。それ以外の場合-このコンポーネントの標準的な方法です。



ソリューションは非常に簡潔で信頼性が高いことが判明しました。 しかし、私はさらに進んで2〜3個のボタンを作りたいと思っていました。たとえば、別のウィンドウで開くリストから選択するか、フィールドを偶発的な変更から保護するために編集モードをオン/オフするなど、ボタンにどのような機能をかけることができるかわかりません。



それでは、始めましょう:

1.空のアクティビティで新しいプロジェクトを作成します(Android Studio 1.5.1開発環境)。



2.新しいクラスを追加して、MyCustomEditTextという完全なリストを呼び出します。



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.コンポーネントに必要なプロパティを持たせるには、次の内容でattrs.xmlを作成します。



 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyCustomEditText"> <attr name="drawableRight2" format="reference"/> <attr name="drawableRight3" format="reference"/> </declare-styleable> </resources>
      
      





4.次に、マークアップファイルでこれらのプロパティの値を設定できます。



 <ru.vlsoft.mycustomedittext.MyCustomEditText android:id="@+id/customEditText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:drawableEnd="@drawable/one" android:drawableRight="@drawable/one" android:textAppearance="?android:attr/textAppearanceLarge" app:drawableRight2="@drawable/two" android:singleLine="true" app:drawableRight3="@drawable/three" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" />
      
      





5.最後に、メインアクティビティにonTouchListenerイベントハンドラーを追加します。その完全なリストは以下のとおりです。



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





プロジェクト全体はこちらからダウンロードできます 。 ご協力ありがとうございます。



All Articles