【问题标题】:Extending a EditText in Android. What am I doing wrong?在 Android 中扩展 EditText。我究竟做错了什么?
【发布时间】:2011-11-30 17:25:20
【问题描述】:

所以我试图掌握在 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"/> 

【问题讨论】:

标签: java android android-edittext android-custom-view extend


【解决方案1】:

您将需要实现这些构造函数:

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 属性传递给 Super 类 (EditText),您必须重写这些构造函数。

希望有所帮助。

【讨论】:

  • 谢谢!我希望我至少可以从编译器或运行时获得有关错误的指示。但是 Eclipse 只是在一些内部方法调用中间停止,没有任何异常信息,没有错误,什么都没有。
  • xml属性在AtributeSet attrs中,所以有必要实现它们:)
  • Error inflating class CustomEditText ... 对我不起作用... :-/
  • @StefanBrendle 你实现了所有的构造函数吗?可能有 4 个,具体取决于 android 版本
  • 我必须在布局 xml 文件中设置类路径,然后它才起作用 :)
【解决方案2】:

您必须添加此构造函数才能创建任何自定义视图。

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

而不是

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

【讨论】:

    【解决方案3】:
    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 1970-01-01
      • 2019-02-15
      • 2016-07-18
      • 2019-12-23
      • 2019-10-23
      • 2014-06-15
      • 1970-01-01
      • 2015-08-26
      相关资源
      最近更新 更多