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

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

我到底做错了什么?

欢迎任何意见。


当前回答

根据我的经验,这似乎也会发生在你的代码被调用后OnDestroyView(当片段是在后面的堆栈)。如果您正在根据BroadCastReceiver的输入更新UI,则应该检查是否存在这种情况。

其他回答

在我的特殊情况下,我试图添加一个页脚到一个ListView。onCreate()中的下面调用返回null。

TextView footerView = (TextView) placesListView.findViewById(R.id.footer);

将此更改为膨胀页脚视图,而不是通过ID查找它解决了这个问题。

View footerView = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_view, null, false);

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

当我试图为ListView做一个自定义视图时,我也面临着类似的问题。

我的解决方法很简单:

public View getView(int i, View view, ViewGroup viewGroup) {

    // Gets the inflater
    LayoutInflater inflater = LayoutInflater.from(this.contexto);

    // Inflates the layout
    ConstraintLayout cl2 = (ConstraintLayout) 
    inflater.inflate(R.layout.custom_list_view, viewGroup, false);

    //Insted of calling just findViewById, I call de cl2.findViewById method. cl2 is the layout I have just inflated. 
     TextView tv1 = (TextView)cl2.findViewById(cl2);

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

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

确保在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(简历); 它将自定义视图放在框架中。