2012-11-05 11 views

Odpowiedz

4

utworzyć własny kontrolę EditText

Oto przykład, że tworzył dla Ciebie:

Po wybraniu pliku juste trzeba zmienić mPaint.setColor (Color.GREEN); na inny kolor

public class CustomEditText extends EditText{ 


private Rect mRect; 
private Paint mPaint; 
int widthMsSize; 
int heightMsSize ; 
// we need this constructor for LayoutInflater 
public CustomEditText(Context context, AttributeSet attrs) { 
    super(context, attrs); 


    mPaint = new Paint(); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeWidth(5); 
    mPaint.setColor(Color.GREEN); 

    System.out.println("constructor"); 
} 

protected void onMeasure(final int widthMeasureSpec, 
     final int heightMeasureSpec) { 
    // Extract the Ms (MesaureSpec) parameters 

    widthMsSize = MeasureSpec.getSize(widthMeasureSpec); 

    heightMsSize = MeasureSpec.getSize(heightMeasureSpec); 

    System.out.println("on measure"); 
    // Satisfy contract by calling setMeasuredDimension 
    setMeasuredDimension(widthMsSize, 
      heightMsSize); 



} 

protected void onDraw(Canvas canvas) { 

    canvas.drawLine(5, heightMsSize-10, widthMsSize-5, heightMsSize-10, mPaint); //draw underline 

    canvas.drawLine(8, heightMsSize-10,8, heightMsSize-20, mPaint); //draw left corner 

    canvas.drawLine(widthMsSize-8, heightMsSize-10,widthMsSize-8, heightMsSize-20, mPaint); //draw right corner 

    super.onDraw(canvas); 
} 

}

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:orientation="vertical" > 

    <com.example.testanimationfadeinfadeout.CustomEditText 
     android:id="@+id/textedit" 
     android:layout_width="228dp" 
     android:layout_height="41dp" 
     android:ems="10" 
     android:hint="color is changed" /> 

</LinearLayout> 
+0

Wow, Dzięki za tym szybko i pomocnego postu! Jeszcze jedno (głupie) pytanie. Jeśli chcę dodać dynamicznie w moim projekcie CustomEditText, co powinienem umieścić w AttributeSet? Miły wieczór, tak bardzo dziękuję i przepraszam za zły angielski;) –

+0

cześć ponownie! AttributeSet to właściwości, które zadeklarowałeś w swoim xml jak android: podpowiedź, itp. Jeśli nie potrzebujesz tego, musisz użyć publicznego CustomEditText (kontekst kontekstu) {super (kontekst); ...} jako konstruktor ps: nie ma głupie pytanie na stackoverflow! :) – Frank

+0

Witam po raz trzeci! Mam teraz nowy problem. Nie dostaję żadnego EditText na moim layoucie. Czy muszę nadpisać niektóre funkcje, takie jak getDraw lub coś, co używa układu? Mój kod: 'layout = (LinearLayout) findViewById (R.id.main_layout); CustomEditText customET = new CustomEditText (this); // getApplicationContext(); nie działa też. customET.setText (tekst); customET.setLayoutParams (new LayoutParams ( \t LayoutParams.FILL_PARENT, \t LayoutParams.WRAP_CONTENT)); layout.addView (customET); ' Masz pojęcie, jaki może być problem? –

0

Aby dostosować edytować tekst zrobiłem następujący sposób. To działało dla mnie w całkiem prosty sposób.

public class CardNumberText extends EditText { 

    boolean isFocus; 
    Paint mPaint; 
    Rect mRect; 
    int widthSize, heightSize; 

    public CardNumberText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

     initStyle(); 

    } 

    private void initStyle() { 
     mRect = new Rect(); 
     mPaint = new Paint(); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setColor(Color.parseColor("#B3B3B3")); 
    } 

    public CardNumberText(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     initStyle(); 
    } 

    public CardNumberText(Context context) { 
     super(context); 

     initStyle(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     Rect rect = mRect; 
     Paint paint = mPaint; 
     if (isFocus) { 
      mPaint.setStrokeWidth(3.0f); 
      mPaint.setColor(Color.parseColor("#80CBC4")); 
     } else { 
      mPaint.setStrokeWidth(1.5f); 
      mPaint.setColor(Color.parseColor("#B3B3B3")); 
     } 
     for (int i = 0; i < getLineCount(); i++) { 
      int baseline = getLineBounds(i, rect); 
      canvas.drawLine(rect.left, baseline + 20, rect.right, baseline, 
        paint); 
     } 

    } 

    @Override 
    protected void onFocusChanged(boolean focused, int direction, 
      Rect previouslyFocusedRect) { 
     super.onFocusChanged(focused, direction, previouslyFocusedRect); 
     if (focused) { 
      isFocus = true; 
     } else { 
      isFocus = false; 
     } 
    } 
} 
2
public static void setEditTextUnderlineColor(final EditText editText, final int focusedColor, final int unfocusedColor) { 
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus) { 
       editText.getBackground().setColorFilter(focusedColor, PorterDuff.Mode.SRC_ATOP); 
       return; 
      } 
      editText.getBackground().setColorFilter(unfocusedColor, PorterDuff.Mode.SRC_ATOP); 
     } 
    }); 

    editText.getBackground().setColorFilter(unfocusedColor, PorterDuff.Mode.SRC_ATOP); 
+0

Stary post, ale wciąż świetny – oga