Enfrenté un problema extraño (o tal vez un comportamiento inesperado) en mi dispositivo Android.
El problema es que estoy escuchando cambios de configuración en mi DialogFragment como este:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Do something secret here :) } android:configChanges a la actividad que es responsable de mostrar el fragmento de diálogo
<activity android:name=".SecretActivity" android:configChanges="orientation|screenSize" android:windowSoftInputMode="adjustResize" /> y, de hecho, recibo devoluciones de llamada del sistema cuando estoy girando el dispositivo, pero no en todos los casos. Como puede ver en la imagen onConfigurationChanged( ) se llama solo cuando estoy girando 90 grados, y también 360, en otros casos no se llama.
¿Es este un comportamiento esperado? En caso afirmativo, ¿cómo puedo detectar todas las rotaciones (90, 180, 270, 360)?
Si tiene una actividad con una orientación de pantalla no especificada, los dispositivos generalmente ignoran la rotación de 180° y solo admiten una dirección horizontal.
Para admitir todas las direcciones, agregue un atributoscreenOrientation explícito a su entrada de manifiesto de actividad: user o sensor , dependiendo de si desea admitir el bloqueo de orientación del dispositivo por parte del usuario o no.
OrientationEventlistener no funcionará cuando el dispositivo no esté girando o moviéndose.
Encuentro que el oyente de pantalla es una mejor manera de detectar el cambio.
DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() { @Override public void onDisplayAdded(int displayId) { android.util.Log.i(TAG, "Display #" + displayId + " added."); } @Override public void onDisplayChanged(int displayId) { android.util.Log.i(TAG, "Display #" + displayId + " changed."); } @Override public void onDisplayRemoved(int displayId) { android.util.Log.i(TAG, "Display #" + displayId + " removed."); } }; DisplayManager displayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); displayManager.registerDisplayListener(mDisplayListener, UIThreadHandler);onDisplayChanged se activa solo exactamente cuando cambia getRotation(). OrientationEventListener, por otro lado, se activa constantemente en tiempo real e incluso antes de que cambie getRotation(), lo que genera valores de rotación de pantalla completamente incorrectos cuando se realiza un giro de 180° desde una perspectiva.
Hmm, verifique el manifiesto, agregue esto/modifique
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"