2011-10-04 64 views
7

所以我試圖掌握在Android中使用自定義控件。但是我的應用程序在嘗試創建活動時崩潰。下面的代碼:在Android中擴展EditText。我究竟做錯了什麼?

package com.myApp; 
import android.content.Context; 
import android.widget.EditText; 
import android.view.View; 
import android.view.View.OnClickListener; 

public class MyEditText extends EditText implements OnClickListener { 

    public MyEditText(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 
    public void FlashBorder() 
    { 
     //do some custom action 
    } 
    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     EditText txt = (EditText) v; 
     txt.selectAll(); 
    } 
} 

這裏的佈局XML:

<com.myApp.MyEditText 
    android:id="@+id/edtTaskName" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent"/> 
+0

檢查這個網址:: http://stackoverflow.com/questions/2026873/android-way-to-appear-bordered-text-on-the-textview –

回答

9

您需要實現這些構造函數:

public class TestEditText extends EditText { 
    public TestEditText(Context context) { 
     super(context); 
    } 

    public TestEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public TestEditText(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public TestEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 
} 

例如儘量做到以下幾點:

public TestEditText(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    Log.i("attribute name at index 0", attrs.getAttributeName(0)); 
} 

你會得到在你的logcat中:

attribute name at index 0 = id 

因此,要將這些XML屬性傳遞給超類(EditText),您必須重寫這些構造函數。

希望有所幫助。

+2

謝謝!我希望我至少能夠從編譯器或運行時得到關於什麼是錯誤的指示。但是Eclipse只是在一些內部方法調用的中間停下來,沒有任何異常信息,沒有錯誤,沒有任何東西。 – taralex

+0

xml屬性位於AtributeSet attrs中,因此需要實現它們:) –

+0

錯誤膨脹類CustomEditText' ...對我不起作用...: -/ –

1

您必須添加此構造函數用於創建任何自定義視圖。

public MyEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
..... 
} 

,而不是

public MyEditText(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 
0
import android.annotation.TargetApi; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Typeface; 
import android.os.Build; 
import android.util.AttributeSet; 




/** 
* Created by rohann on 14/07/2016. 
*/ 
public class LightEditText extends android.widget.EditText{ 

    public LightEditText(Context context) { 
     super(context); 
     setFont(); 

    } 

    public LightEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setFont(); 
    } 

    public LightEditText(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     setFont(); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public LightEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     setFont(); 
    } 

    /** 
    * This method is used to set the given font to the TextView. 
    */ 
    private void setFont() { 
     Typeface typeface = TypefaceCache.get(getContext().getAssets(), "fonts/Roboto-Light.ttf"); 
     setTypeface(typeface); 
    } 

    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
    } 
}