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

大多数都建议使用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应该正常工作。令人惊讶的是:它并没有解决任何问题。

我到底做错了什么?

欢迎任何意见。


当前回答

我对Android/Eclipse很新,我错误地将UI的东西添加到activity_main.xml而不是fragment_main.xml。我花了好几个小时才弄明白……

其他回答

在我的例子中,当我将调用从父对象移动到由父对象实例化的适配器对象时,findViewById返回null。在尝试了这里列出的技巧但没有成功之后,我将findViewById移回父对象中,并在适配器对象实例化期间将结果作为参数传递。 例如,我在父对象中这样做:

 Spinner hdSpinner = (Spinner)view.findViewById(R.id.accountsSpinner);

然后我在创建适配器对象时将hdSpinner作为参数传递:

  mTransactionAdapter = new TransactionAdapter(getActivity(),
        R.layout.transactions_list_item, null, from, to, 0, hdSpinner);

对于那些使用ExpandableListView并根据它的标题遇到这个问题的人来说,这是一个答案。

我有这个错误试图与TextViews在我的孩子和组视图作为一个expandabelistview实现的一部分。

您可以在getChildView()和getGroupView()方法的实现中使用如下内容。

        if (convertView == null) {
            LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.child_layout, null);
        }

我在这里找到了这个。

确保你的布局没有针对不同屏幕密度的多个版本。我曾经遇到过这个问题,当添加一个新的id到现有的布局,但忘记更新hdpi版本。如果你忘记更新所有版本的布局文件,它将工作的一些屏幕密度,但不是其他。

在我的例子中,我的项目中有两个活动,main.xml和main2.xml。从一开始,main2是main的副本,一切都工作得很好,直到我添加了新的TextView到main2,所以R.id。textview1成为可用的应用程序的其余部分。然后我试图通过标准调用获取它:

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

它总是空的。事实证明,在onCreate构造函数中,我实例化的不是main2,而是另一个。我有:

setContentView(R.layout.main);

而不是

setContentView(R.layout.main2);

我到这里后,在工地上注意到了这一点。

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

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

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

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