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

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

我到底做错了什么?

欢迎任何意见。


当前回答

在我的例子中,我的项目中有两个活动,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);

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

其他回答

除了在其他地方提到的经典原因之外:

确保在findViewById()之前调用了setContentView() 确保你想要的id在你给setContentView()的视图或布局中 确保id不会意外地在不同的布局中重复

我在标准布局中找到了一个自定义视图,这与文档相悖:

理论上,您可以创建一个自定义视图并将其添加到布局中(参见这里)。然而,我发现在这种情况下,有时id属性适用于布局中的所有视图,除了自定义视图。我使用的解决方案是:

将每个自定义视图替换为具有与自定义视图相同的布局属性的FrameLayout。给它一个适当的id,比如frame_for_custom_view。 在onCreate: setContentView (R.layout.my_layout); FrameView fv = findViewById(R.id.frame_for_custom_layout); MyCustomView cv = new MyCustomView(context); fv.addView(简历); 它将自定义视图放在框架中。

除了以上的解决方案,你要确保 工具:上下文= "。TakeMultipleImages” 在布局中与mainfest.xml文件中的值相同: android: name = "。TakeMultipleImages”用于相同的活动元素。 当使用复制粘贴来创建新活动时,就会发生这种情况

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

我也有同样的问题,但我认为值得和你们分享。 如果你必须在自定义布局中找到viewbyid,例如:

public class MiniPlayerControllBar extends LinearLayout {
    //code
}

你不能在构造函数中得到视图。 你应该在视图膨胀后调用findViewById。 他们是一个方法,你可以覆盖onfinishinflation

我的情况不像上面那样,没有解决方案。我认为我的观点过于深入布局层次结构。我向上移动了一层,它就不再是空了。