Disable and enable orientation changes in an activity in Android programatically

故事扮演 提交于 2019-12-05 20:57:00

问题


I have an App that make some background staff. When the background work is running a progress Circle is shown, if the device is rotated during this time then the Activity is "reset" and I want to avoid that.

For this reason I decided disable orientation during this process. I have seen differends threads for this question but none with a valid solution, at least in my case.

The solutions posted are about fixing the activity orientation but you have to deal with the fact that the REVERSE orientations are not returned if you use:

getResources().getConfiguration().orientation

The function above returns SCREEN_ORIENTATION_PORTRAIT both for PORTRAIT and REVERSE_PORTRAIT cases (at least in my tests).

So at the end I used the Rotation value to deal with that, so my code "disable the rotation" is:

int rotation = getWindowManager().getDefaultDisplay().getRotation();

    switch(rotation) {
    case Surface.ROTATION_180:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        break;
    case Surface.ROTATION_270:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);         
        break;
    case  Surface.ROTATION_0:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        break;
    case Surface.ROTATION_90:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        break;
    }

And to allow again the orientation:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

That works perfectly in a device with Android 4.1.2 but in a Device with Android 4.2.1 it is not working as expected.

I guess managing rotation in the activity live cycle should be a common issue but I have not been able to find a suitable solution. May be I'm looking to the wrong direction so any help is really welcomed.

Thanks in advance, Ivan.


回答1:


If you want to disable orientation changes of the phone then you may use this code in the manifest

<activity android:name=".class_name"

//if you want your screen in portrait

android:screenOrientation="portrait" >

//if you want you screen in landscape mode

android:screenOrientation="landscape" >

and if you want your phone to change orientation but prevent the process from restarting then you can use the onConfigurationChanged method in your class:

@Override
public void onConfigurationChanged(Configuration newConfig) {
   // ignore orientation change
   if (newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE) {
       super.onConfigurationChanged(newConfig);
   }
}



回答2:


Try this..

There is no wrong in your code. It's correct i checked it. Use that code in onConfigurationChanged that may give the difference and another thing is use below code to disable the activity reset.

<activity
    android:name="YourActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:windowSoftInputMode="adjustPan"/>  



回答3:


You could override the on onConfiguratoinChanged method to disable orientation changes:

@Override
public void onConfigurationChanged(Configuration newConfig) {
   // ignore orientation change
   if (newConfig.orientation != Configuration.ORIENTATION_LANDSCAPE) {
       super.onConfigurationChanged(newConfig);
   }
}

Do not forget to enable the orientation changed listener in your AndroidManifest.xml file:

<activity android:configChanges="orientation" >



回答4:


Simple: one line to add after Activity Name in android manifest

android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale

This worked for me.



来源:https://stackoverflow.com/questions/20021803/disable-and-enable-orientation-changes-in-an-activity-in-android-programatically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!