I have an application that I just would like to use in portrait mode, so I have defined android:screenOrientation="portrait" in the manifest XML. This works OK for the HTC magic phone (and prevents orientation changes on other phones as well).
But I have a problem with the HTC G1 phone as i open the hardware qwerty keyboard (not the virtual keyboard). My activity stays in portrait mode, but seems to get restarted and loses all its states. This does not happen with the hero version.
My application is quite big so I don't want it to restart and lose all its states when the keyboard is opened. Any idea on how I can prevent that?
Source: Tips4all
Add android:configChanges="keyboardHidden|orientation" to your AndroidManifest.xml. This tells the system what configuration changes you are going to handle yourself - in this case by doing nothing.
ReplyDelete<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
See http://developer.android.com/reference/android/R.attr.html#configChanges for more details.
However, your application can be interrupted at any time, e.g. by a phone call, so you really should add code to save the state of your application when it is paused.
Update: As of Android 3.2, you also need to add "screenSize":
<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation|screenSize">
From http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange:
Caution: Beginning with Android 3.2 (API level 13), the "screen size"
also changes when the device switches between portrait and landscape
orientation. Thus, if you want to prevent runtime restarts due to
orientation change when developing for API level 13 or higher (as
declared by the minSdkVersion and targetSdkVersion attributes), you
must include the "screenSize" value in addition to the "orientation"
value. That is, you must declare
android:configChanges="orientation|screenSize". However, if your
application targets API level 12 or lower, then your activity always
handles this configuration change itself (this configuration change
does not restart your activity, even when running on an Android 3.2 or
higher device).
You need to modify AndroidManifest.xml as Ashton mentioned and make sure the activity handles the onConfigurationChanged event as you want it handled. This is how it should look:
ReplyDelete@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
I've always found you need both
ReplyDeleteandroid:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
in your androidmanifest.xml
ReplyDelete<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
or
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
As said, set android:configChanges of your Activity (in manifest file) to "keyboardHidden|orientation" and then:
ReplyDelete1) Override onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//here you can handle orientation change
}
2) Add this line to your activity's onCreate()
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
It's better than add same line to onConfigurationChanged, because your app will turn to portrait mode and then back to landscape (it will happen only one time, but still looks bad).
Also you can set android:screenOrientation="nosensor" for your activity (in manifest). But, using this way, you're a not able to handle orientation changes at all.