在Android中扩展EditText,我做错了什么?

15

我正在尝试在Android中使用自定义控件。但是我的应用程序在尝试创建活动时崩溃了。这是代码:

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"/> 

请检查此网址::https://dev59.com/kEvSa4cB1Zd3GeqPcjRO - Samir Mangroliya
3个回答

19
你需要实现这些构造函数:
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
XML属性在AttributeSet attrs中,因此需要实现它们 :) - Fernando Gallego
“Error inflating class CustomEditText”... 对我没用... :-/ - Stefan Brendle
@StefanBrendle,你实现了所有的构造函数吗?这可能取决于Android版本而有4个。 - Fernando Gallego
我必须在布局XML文件中设置类路径,然后它就可以工作了 :) - Stefan Brendle

2
您需要添加此构造函数来创建任何自定义视图。
public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
.....
}

代替

public MyEditText(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }  

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接