在Android 5.0.2上不调用自定义视图构造函数

Mic*_*l A 22 android android-custom-view

我创建了一个自定义视图:

public class SomeView extends View
Run Code Online (Sandbox Code Playgroud)

自定义视图构造函数:

public SomeView (Context context)
{
    super(context);
}
// Called when view is inflated from xml
public SomeView (Context context, AttributeSet attrs)
{
    super(context, attrs);
}
// Perform inflation from XML and apply a class-specific base style from a theme attribute.
public SomeView (Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
}
Run Code Online (Sandbox Code Playgroud)

我也尝试了api 21中的第4个构造函数而没有运气:

public VeediView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
{
    super(context, attrs,defStyleAttr, defStyleRes);
}
Run Code Online (Sandbox Code Playgroud)

在xml布局中,我定义了这个视图,并且工作正常.

在Galaxy S2上进行测试工作正常并调用视图构造函数,但是当在Nexus-7 android 5.0.2上运行应用程序时,构造函数根本不会被调用.

知道为什么吗?

它可能与root设备有关吗?

相关的xml视图:

<com.package.name

        android:id="@+id/scene"
        android:onClick="startx"
        style="@style/txt_money_style"
        android:layout_width="72dp"
        android:layout_height="72dp"
        android:background="@drawable/wtbtn"
        android:layout_gravity="right"
        android:gravity="center_vertical|right"
        />
Run Code Online (Sandbox Code Playgroud)

小智 7

我认为你应该使用这个构造函数:

public SomeView (Context context)
{
    this(context , null);
}
// Called when view is inflated from xml
public SomeView (Context context, AttributeSet attrs)
{
    this(context, attrs , 0);
}
// Perform inflation from XML and apply a class-specific base style from a theme attribute.
public SomeView (Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
    // Initialize customize constructor here
}
Run Code Online (Sandbox Code Playgroud)


Num*_*617 6

在API 21中,现在是第4个构造函数,可能是您的XML正在调用它.

来自文档:

public View(Context context,AttributeSet attrs,int defStyleAttr,int defStyleRes)

在API级别21中添加

从XML执行通胀并从主题属性或样式资源应用特定于类的基本样式.View的这个构造函数允许子类在膨胀时使用它们自己的基本样式.

确定特定属性的最终值时,有四个输入起作用:

  1. 给定AttributeSet中的任何属性值.
  2. AttributeSet中指定的样式资源(名为"style").
  3. defStyleAttr指定的默认样式.
  4. defStyleRes指定的默认样式.
  5. 此主题中的基础值.

这些输入中的每一个都按顺序考虑,首先列出的输入优先于以下输入.换句话说,如果在您提供的AttributeSet中,则无论任何样式中指定了什么,按钮的文本将始终为黑色.

参数

context运行视图的上下文,通过它可以访问当前主题,资源等.attrs正在膨胀视图的XML标记的属性.defStyleAttr当前主题中的一个属性,它包含对为视图提供默认值的样式资源的引用.可以为0以查找默认值.defStyleRes为视图提供默认值的样式资源的资源标识符,仅在defStyleAttr为0或在主题中找不到时使用.可以为0以查找默认值.


Mic*_*l A 0

问题是我得到了这段代码,但自己没有开发它,在尝试了一切之后发现该应用程序有多个布局文件:

大布局、小布局等...

我只在布局文件夹上定义了自定义视图,因此切换到其他屏幕尺寸会调用常规视图。

我想其他人可以从我的错误中吸取教训,我希望 Android Studio 或 Eclipse 可以支持某种 setContentView(R.layout.activity_scene) 和相关的文件调试选项

所以答案是确保所有布局都定义了自定义视图