自定义视图的三个参数化构造函数不调用?

时间:2015-05-12 18:05:25

标签: android android-layout layout android-custom-view android-styles

我希望通过扩展View类来创建自定义视图。然后我定义了所有三个构造函数。(在我的自定义视图代码下面)

public class CustomButton extends Button
{
    public CustomButton(Context context)
    {
        super(context);
    }

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

    public CustomButton(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, R.attr.testStyle);
    }
}

Xml代码:

   <com.example.viewlifecycledemo.CustomButton
    style="@style/test"
    android:layout_width="100dp"
    android:layout_height="100dp" />

只调用了ViewLifeCycleClass(Context context, AttributeSet attrs),但我应用了样式,因此ViewLifeCycleClass(Context context, AttributeSet attrs, int defStyleAttr)此方法应该被调用。

任何人都可以告诉我,为什么两个参数化被称为?

此链接对我不起作用:Android Custom View Constructor

3 个答案:

答案 0 :(得分:0)

您的代码应如下所示:

public class CustomButton extends Button
{
    private LayoutInflater mInflater;
    public CustomButton(Context context)
    {
        super(context);
    }

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

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

这里的问题是您在第三个custructor中调用了R.attr.testStyle,而不是defStyleAttr。由于您使用的是自定义样式,因此您的第三个构造函数正在运行,但您在super()上传递了错误的参数。要知道每次调用哪个exacly构造函数,read this answer

答案 1 :(得分:0)

以下是文档中有关创建自定义视图的内容:

  

从XML布局创建视图时,XML标记中的所有属性都从资源包中读取,并作为AttributeSet传递到视图的构造函数中。虽然可以直接从AttributeSet读取值,但这样做有一些缺点:

     

*属性值中的资源引用未解析

     

*未应用样式

http://developer.android.com/training/custom-views/create-view.html

听起来像在XML中分配样式总是会导致调用2参数构造函数。我不确定如何强制调用3参数构造函数,除非你在代码中明确地这样做。我不知道这段代码是否适合您,因为我没有尝试使用3参数构造函数实例化我的自定义视图,但是它的一部分可能对您有帮助吗?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FrameLayout yourLayout = (FrameLayout) findViewById(R.id.yourLayoutId);
    CustomButton yourButton = new CustomButton(this, attrs, R.style.yourStyleId);
    yourLayout.addView(yourButton);
    setContentView(yourLayout);
}

答案 2 :(得分:0)

答案是具有三个参数的构造函数永远不会被Android调用。你只能自己调用​​它,例如在其他一个构造函数中。