首先,是的,我读了关于这个话题的所有其他帖子。不仅仅是这个网站的人…(你看,我有点沮丧)

大多数都建议使用android:id,而不是XML文件中的id。我做到了。

我从别人那里了解到,这种观点。findViewById的工作方式与Activity.findViewById不同。我也处理了。

在我的location_layout.xml中,我使用:

<FrameLayout .... >
    <some.package.MyCustomView ... />

    <LinearLayout ... >
        <TextView ...
            android:id="@+id/txtLat" />
        ...
    </LinearLayout>
</FrameLayout>

在我的活动中,我做:

...
setContentView( R.layout.location_layout );

在我的自定义视图类中:

... 
TextView tv = (TextView) findViewById( R.id.txtLat );

返回null。这样做,我的Activity工作得很好。所以这可能是因为活动。findViewById和View。findViewById差异。所以我存储上下文传递给本地的海关视图构造函数,并尝试:

...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );

它也返回null。

然后,我改变了我的自定义视图扩展ViewGroup而不是视图,并改变了location_layout.xml,让TextView是我的自定义视图的直接子,以便视图。findViewById应该正常工作。令人惊讶的是:它并没有解决任何问题。

我到底做错了什么?

欢迎任何意见。


当前回答

调试和查找问题的方法:

注释掉活动中的所有findViewById。 注释掉所有的东西,除了onCreate和setContentView 运行项目并查看是否设置了任何布局

在我的情况下,我使用activity_main.xml在我的应用程序模块和我的库模块。所以当我执行上面的步骤,而不是我在库中设计的布局,app模块内的布局是膨胀的。

因此,我将activity_main_xml文件名称改为activity_main_lib.xml。

因此,请确保在整个项目中没有任何重复的布局名称。

其他回答

在我的情况下,我使用ExpandableListView,我设置了android:transcriptMode="normal"。这导致可扩展组中的几个孩子消失,我习惯了在我使用滚动列表时得到NULL异常。

对我来说,同一个活动有两个xml布局——一个竖屏模式,一个横屏模式。当然,我已经在landscape xml中更改了一个对象的id,但忘记在portrait版本中做同样的更改。如果您更改了一个xml,请确保对另一个xml也执行相同的操作,否则在运行/调试它之前不会得到错误,并且它无法找到未更改的id。哦,愚蠢的错误,你为什么要这样惩罚我?

从布局资源中设置活动内容。 即,setContentView (R.layout.basicXml);

返回null

可能是因为你说得太早了。等待到onfinishinflation()。下面是一个示例项目,演示了一个自定义视图访问其内容。

我也有同样的问题。我使用了一个第三方库,它允许你覆盖GridView的适配器,并为每个GridView单元指定自己的布局。

我终于意识到发生了什么。Eclipse仍然在为GridView中的每个单元格使用库的布局xml文件,尽管它没有给出这一点指示。在我的自定义适配器中,它表明它正在使用来自我自己项目的xml资源,尽管在运行时并不是这样。

所以我所做的是确保我的自定义xml布局和id与那些仍然坐在库中,清理项目,然后它开始读取正确的自定义布局,在我的项目中。

简而言之,如果要覆盖第三方库的适配器并指定自己的布局xml供适配器使用,请小心。如果项目中的布局与库中的布局具有相同的文件名,那么您可能会遇到一个非常难以找到的错误!