Graham Borland
Graham Borland

Reputation: 60711

Do you have to call setContentView() from onConfigurationChanged()?

I've set the manifest entry for my Activity so that it handles orientation changes by itself.

In my onConfigurationChanged(), I've got this:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    findViewById(R.id.header).post(new Runnable() {
        @Override
        public void run() {
        }
    });
}

After months of working without problems, I've just had a NullPointerException on the findViewById() line. My conclusion is that the View in question hasn't been created yet, due to the omission of setContentView().

Is setContentView() really necessary here? If so, why has it been working all this time without incident?

Upvotes: 1

Views: 2192

Answers (2)

Felix
Felix

Reputation: 89626

No, calling setContentView is not necessary in that situation. Something else in your code is causing the findVieWById to return null.

Upvotes: 2

Codeman
Codeman

Reputation: 12375

From the Android Activity Docs:

If the configuration of the device (as defined by the Resources.Configuration class) changes, then anything displaying a user interface will need to update to match that configuration. Because Activity is the primary mechanism for interacting with the user, it includes special support for handling configuration changes.

Unless you specify otherwise, a configuration change (such as a change in screen orientation, language, input devices, etc) will cause your current activity to be destroyed, going through the normal activity lifecycle process of onPause(), onStop(), and onDestroy() as appropriate. If the activity had been in the foreground or visible to the user, once onDestroy() is called in that instance then a new instance of the activity will be created, with whatever savedInstanceState the previous instance had generated from onSaveInstanceState(Bundle).

This is done because any application resource, including layout files, can change based on any configuration value. Thus the only safe way to handle a configuration change is to re-retrieve all resources, including layouts, drawables, and strings. Because activities must already know how to save their state and re-create themselves from that state, this is a convenient way to have an activity restart itself with a new configuration.

In some special cases, you may want to bypass restarting of your activity based on one or more types of configuration changes. This is done with the android:configChanges attribute in its manifest. For any types of configuration changes you say that you handle there, you will receive a call to your current activity's onConfigurationChanged(Configuration) method instead of being restarted. If a configuration change involves any that you do not handle, however, the activity will still be restarted and onConfigurationChanged(Configuration) will not be called

Basically, you need to ensure that you are saving your instance state, and getting the information back after onConfigurationChanged()

Hope this helps!

Upvotes: 1

Related Questions