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

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

我到底做错了什么?

欢迎任何意见。


当前回答

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

其他回答

返回null

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

对我来说,问题是我有两个具有相同文件名activity_main.xml的布局。(布局在不同的库中,但在同一个应用程序中)通过将其中一个重命名为唯一的名称解决了这个问题。

膨胀布局!!(包含id)

在我的例子中,findViewById()返回null,因为元素被写入的布局没有被膨胀…

如。 fragment_layout.xml

<ListView
android:id="@+id/listview">

findViewById(R.id.listview)返回null,因为我没有做 inflater.inflate (R.layout.fragment_layout……,……); 在这之前。

希望这个答案能帮助到你们。

我试过以上所有的方法,但都没有效果。所以我必须让我的ImageView static public static ImageView texture;然后texture = (ImageView) findViewById(R.id.texture_back);,我不认为这是一个好方法,但这确实对我的情况有效:)

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