【问题标题】:Android custom view context is null.. how can that be?Android自定义视图上下文为空..怎么可能?
【发布时间】:2014-11-16 16:29:00
【问题描述】:

我正在开发一个非常简单的自定义视图,我的视图只是扩展了视图,并且有一个绘图方法

public class MyView extends View ;



public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    System.out.println("CONTEXT!!! "+context);
}

@Override
public void draw (Canvas canvas){
...
}

XML 定义是:

<com.mycode.MyView
     android:id="@+id/overlay"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
 />

Android 正确地尝试实例化该类,并按预期调用绘图...不幸的是,在绘图方法中,上下文为空。所以我把 system.out.println 放在构造函数中,以查看上下文在实例化时不为空......但那条线永远不会被击中......那是怎么回事?我是否处于某个我不理解 Android 可能在完成创建上下文之前调用 draw 的生命周期中?在这种情况下,我怎么能让 Context 不为 null 呢?

我不明白视图如何被实例化/膨胀到调用 draw 方法的程度,但没有上下文。

任何帮助将不胜感激。

【问题讨论】:

  • 很难说发生了什么。 Activity 或 Fragment 中的布局是否以某种方式膨胀?能发一下抽奖的内容吗?
  • 你可以尝试添加默认构造函数public MyView(Context context)然后在你的2个构造函数中添加一个断点。
  • xml里面定义了一个fragment,但是myview不是任何fragment的一部分,直接定义在activity_xml中至于draw,内容真的无所谓,第一行draw 是 context.getResources() 失败,因为 context 是 NULL。
  • @VincentD 添加 MyView(Context context) 不会导致任何变化,它不会被调用并且 context 仍然为空。
  • @user282172 你看到我的回答了吗?

标签: android view android-custom-view android-context


【解决方案1】:

View 有 4 个构造函数(从 API 21 开始)。框架可能正在调用 View(android.content.Context, android.util.AttributeSet, int) 版本的构造函数,阻止您看到 Log 语句。

我不知道您是如何获得Context 的引用的,但我敢打赌,您在未调用的构造函数中设置了类似this.context = context 的内容。在onDraw() 中使用View.getContext()

【讨论】:

  • 我的类只是扩展视图,所以无论膨胀/实例化调用哪个构造函数,我都希望它在我的子类中可用,不是吗?作为记录,我此时重载了所有 3 个构造函数,似乎没有一个被称为第 4 个上下文,当我尝试在 super 上调用它时,attribs、int、int 在我的运行时未定义,所以假设一个是更高的一部分版本比我的目标...它们似乎都没有被调用..好像 DRAW 在构造之前被调用......或者我缺少一个演员......我肯定很困惑。跨度>
  • 好的,我的错误上下文是在它被调用的构造函数中定义的......我只是在日志中错过了它......愚蠢的人为错误......非常感谢您的帮助...... . 有一个未设置的上下文的本地副本,因此,即使构造函数正确地拥有它,后来的引用也是空的。哇!
  • 很高兴为您提供帮助。请将此问题标记为已回答。
猜你喜欢
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
相关资源
最近更新 更多