First of all: yes, I read all the other threads on this topic. And not only those from this site... (you see, I'm a little frustrated)
Most of them come with the advice to use android:id
instead of just id
in the XML file. I did.
From others, I learned, that View.findViewById
works different than Activity.findViewById
. I handled that, too.
In my location_layout.xml
, I use:
<FrameLayout .... >
<some.package.MyCustomView ... />
<LinearLayout ... >
<TextView ...
android:id="@+id/txtLat" />
...
</LinearLayout>
</FrameLayout>
In my Activity I do:
...
setContentView( R.layout.location_layout );
and in my custom view class:
...
TextView tv = (TextView) findViewById( R.id.txtLat );
which returns null
. Doing this, my Activity works fine. So maybe it's because of the Activity.findViewById
and View.findViewById
differences. So I stored the context passed to the customs view constructor locally and tried:
...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );
which also returned null
.
Then, I changed my custom view to extend ViewGroup
instead View
and changed the location_layout.xml
to let the TextView
be a direct child of my custom view, so that the View.findViewById
should work as supposed. Suprise: it didn't solve anything.
So what the heck am I doing wrong?
I'll appreciate any comments.
FWIW, I don't see that anyone solved this in quite the same way as I needed to. No complaints at compile time, but I was getting a null view at runtime, and calling things in the proper order. That is, findViewById() after setContentView(). The problem turned out that my view is defined in content_main.xml, but in my activity_main.xml, I lacked this one statement:
When I added that to activity_main.xml, no more NullPointer.
INFLATE THE LAYOUT !! (which contains the id)
In my case findViewById() returned null, because the layout in which the element was written, was not inflated...
Eg. fragment_layout.xml
findViewById(R.id.listview) returned null, because I had not done inflater.inflate(R.layout.fragment_layout, ..., ...); before it.
Hope this answer helps some of y'all.
In my case, I was using ExpandableListView and I had set
android:transcriptMode="normal"
. This was causing few children in expandable group to disappear and I used to get NULL exception when ever I used scroll the list.In my case I had inflated the layout but the child views were returning null. Originally I had this:
However, when I changed it to the following it worked:
The key was to specifically reference the already inflated layout in order to get the child views. That is, to add
footerView
:Make sure you don't have multiple versions of your layout for different screen densities. I ran into this problem once when adding a new id to an existing layout but forgot to update the hdpi version. If you forget to update all versions of the layout file it will work for some screen densities but not others.
Just wanted to throw my specific case in here. Might help someone down the line.
I was using the directive in my Android UI XML like this:
Parent view:
Child view (retry_button):
.findViewById(R.id.retry) would always return null. But, if I moved the ID from the child view into the include tag, it started working.
Fixed parent:
Fixed child: