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

大多数都建议使用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之前调用了findViewById ? 如果是这种情况,尝试在调用setContentView之后调用findViewById

其他回答

对我来说,它返回null,因为给定的控件是(以编程方式)隐藏的。当我只在控件可见时调用findViewByID(id)时,它又开始工作了。

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

当我试图为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);

如果你在Fragment中,findViewById也可以返回null。如上所述:在Fragment中找到viewbyid

你应该调用getView()来返回Fragment中最顶层的View。然后你可以找到布局项(按钮,文本视图等)

调试和查找问题的方法:

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

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

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

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