findViewById() returns null for custom component in layout XML, not for other components

Viewed 54942

I have a res/layout/main.xml including these elements and others:

<some.package.MyCustomView android:id="@+id/foo" (some other params) />
<TextView android:id="@+id/boring" (some other params) />

In my Activity's onCreate, I do this:

setContentView(R.layout.main);
TextView boring = (TextView) findViewById(R.id.boring);
// ...find other elements...
MyCustomView foo = (MyCustomView) findViewById(R.id.foo);
if (foo == null) { Log.d(TAG, "epic fail"); }

The other elements are found successfully, but foo comes back null. MyCustomView has a constructor MyCustomView(Context c, AttributeSet a) and a Log.d(...) at the end of that constructor appears successfully in logcat just before the "epic fail".

Why is foo null?

18 Answers

I had the same problem. My mistake was that: I wrote

        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout=inflater.inflate(R.layout.dlg_show_info, null);
        alertDlgShowInfo.setView(layout);
        TableRow trowDesc=(TableRow)findViewById(R.id.trowDesc);

and as I used an inflater to "load" the view from an XML file, the last line was wrong. To solve it, I had to write:

TableRow trowDesc=(TableRow)layout.findViewById(R.id.trowDesc);

I wrote my solution, in case someone have the same problem.

Same issue, but different solution: I didn't call

setContentView(R.layout.main)

BEFORE I tried to find the view as stated here

Related