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

时间:2015-04-20 08:56:29

标签: android android-custom-view

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

public class SomeView extends View

自定义视图构造函数:

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

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

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

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

4 个答案:

答案 0 :(得分:6)

在API 21中,现在是4th constructor可能是您的XML正在调用它。

来自文档:

  

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

     

在API级别21中添加

     

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

     

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

     
      
  1. 给定AttributeSet中的任何属性值。
  2.   
  3. AttributeSet中指定的样式资源(名为&#34; style&#34;)。
  4.   
  5. defStyleAttr指定的默认样式。
  6.   
  7. defStyleRes指定的默认样式。
  8.   
  9. 此主题中的基本值。
  10.         

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

         

    <强>参数

         

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

答案 1 :(得分:5)

我认为你最好使用这个构造函数:

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
}

答案 2 :(得分:1)

以下是引用View.java类的源代码。如果您查看它,您会看到,始终会调用public View(Context context)。如果你认为它没有被调用但是你看到了视图,那么问题在于检测它是否被调用,而不是Android代码中的。你应该看看那里。它可能是在AS中记录代码或一些错误的过滤器,或类似的。

从源代码中你还可以看到,这是新的构造函数,在Android 5.0中使用的更高,实现最多。

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

答案 3 :(得分:0)

问题是我得到了这个代码并且没有自己开发它并且在尝试了所有内容后发现应用程序有多个布局文件:

布局大,布局小等...

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

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

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