OnConfigurationChanged no se ha llamado una vez setRequestedConfiguration se ha utilizado

He fijado la actividad de am para manejar cambios de la configuración y trabaja, significando que onConfigurationChanged() se llama cuando la orientación cambia.

La actividad tiene un botón para cambiar explícitamente la orientación. Cuando se hace clic, se llama setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT) .

Entonces la orientación está irrevocablemente establecida y onConfigurationChanged() ya no se llama.

¿Cómo puedo cambiar la orientación cuando el usuario hace clic en el botón mientras no pierde la devolución de llamada onConfigurationChanged() ?

Así es como lo solucioné. Soy consciente de que está reinventando la rueda, pero cumple con mi requisito y no encontré una forma adecuada de manejar esto con las herramientas estándar de sdk.

En primer lugar, cree una clase OrientationManager que escuche los cambios de orientación

 public class OrientationManager extends OrientationEventListener{ private static final String TAG = OrientationManager.class.getName(); private int previousAngle; private int previousOrientation; private Context context; private OrientationChangeListener orientationChangeListener; private static OrientationManager instance; private OrientationManager(Context context) { super(context); this.context = context; } public static OrientationManager getInstance(Context context){ if (instance == null){ instance = new OrientationManager(context); } return instance; } public int getOrientation(){ return previousOrientation; } public void setOrientation(int orientation){ this.previousOrientation = orientation; } @Override public void onOrientationChanged(int orientation) { if (orientation == -1) return; if(previousOrientation == 0){ previousOrientation = context.getResources().getConfiguration().orientation; if (orientationChangeListener != null){ orientationChangeListener.onOrientationChanged(previousOrientation); } } if (previousOrientation == Configuration.ORIENTATION_LANDSCAPE && ((previousAngle > 10 && orientation <= 10) || (previousAngle < 350 && previousAngle > 270 && orientation >= 350)) ){ if (orientationChangeListener != null){ orientationChangeListener.onOrientationChanged(Configuration.ORIENTATION_PORTRAIT); } previousOrientation = Configuration.ORIENTATION_PORTRAIT; } if (previousOrientation == Configuration.ORIENTATION_PORTRAIT && ((previousAngle <90 && orientation >= 90 && orientation <270) || (previousAngle > 280 && orientation <= 280 && orientation > 180)) ){ if (orientationChangeListener != null){ orientationChangeListener.onOrientationChanged(Configuration.ORIENTATION_LANDSCAPE); } previousOrientation = Configuration.ORIENTATION_LANDSCAPE; } previousAngle = orientation; } public void setOrientationChangedListener(OrientationChangeListener l){ this.orientationChangeListener = l; } public interface OrientationChangeListener{ public void onOrientationChanged(int newOrientation); } } 

A continuación, en su actividad, implemente OrientationChangeListener y anule onOrientationChanged() :

 public class MyActivity extends Activity implements OrientationChangeListener{ private OrientationManager orientationManager; @Override public void onCreate(Bundle b){ orientationManager = OrientationManager.getInstance(this); orientationManager.setOrientationChangedListener(this); } @Override public void onOrientationChanged(int newOrientation) { orientation = newOrientation; if (newOrientation == Configuration.ORIENTATION_LANDSCAPE){ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); setLandscapeConfig(); }else{ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setPortraitConfig(); } } 

Así que ya no uso onConfigurationChanged pero mantengo la siguiente línea en el Manifiesto: android: configChanges = "orientation | screenSize"

Llamada setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); Se reactivará onConfigurationChanged . Puede configurar un temporizador como este:

 // Force orientation to portrait setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); // Reactivate sensor orientation after delay Timer mRestoreOrientation = new Timer(); mRestoreOrientation.schedule(new TimerTask() { @Override public void run() { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); } }, 2000); 

Sólo podemos suponer que el usuario cambiará el dispositivo por sí mismo a la orientación forzada dentro del retraso, y esto puede conducir a una mala experiencia del usuario.

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT) 

Esto hace que su onConfigurationChanged deje de funcionar. Si desea que funcione, intente agregar esto a su manifiesto dentro de esa actividad:

 android:configChanges="orientation|screenSize" 

El atributo screenSize solo es para la API 13+, así que si lo tienes debajo, no lo necesitas

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.