简体   繁体   中英

When does android's ListActivity class call setContentView()?

I'm trying to use the requestWindowFeature() function to set a custom title view on a list activity. The method works fine with a view that only subclasses Activity , but whenever I try the same method with a ListActivity subclass, it errors, giving me a NullPointerException when I try to programmatically modify the title view.

I believe the problem pertains to the fact that requestWindowFeature() needs to be called before setContentView() . Because ListActivity takes care of setting the content view for you, I don't know when that is being called. Does anyone have any suggestions? Thanks for the help.

setContentView is called whenever you interact with the List, for example calling getList() or setAdapter() on listactivity. See the source of listactivity

Sometimes, requestWindowFeature() gives a NullPointerException if it's called after the super.onCreate(bundle); call. Another reason is if you have called setContentView first as well.

super.onCreate(bundle); and setContentView must be called after all requestWindowFeature() calls are made.

ListActivity doesn't take care of calling setContentView for you: you still need to do it yourself. Your content view has to have an appropriately-named ListView but you still need to call setContentView yourself. Just call requestWindowFeature right after the super.onCreate call in onCreate and then call setContentView after that and you should be golden.

EDIT: my mistake, you are quite right (I didn't know that: I've always just called setContentView with a custom layout).

It appears from here that there is no way to slip a requestWindowFeature call before the setContentView call in ListActivity : it ALWAYS calls setContentView immediately after the super.onCreate call. You can try calling requestWindowFeature before you call super.onCreate but I suspect that won't work any better.

I don't think you will be able to use the default ListActivity for this: you'll probably need to use a regular Activity and manually do the ListView bindings.

The solution to my problem, for any googlers, was to copy the source of the ListActivity class, and also the layout_content.xml file into my own app's package, and subclass from this instead of Android's ListActivity class. I then added an onCreate() method to this class where I set request the window feature(s) and then call the setContentView() method. Hack? Probably. Works? Yes :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM