我希望通过扩展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
答案 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调用。你只能自己调用它,例如在其他一个构造函数中。