2012-07-20 18 views
5

Cuando giro mi teléfono Android al revés, mi actividad no gira para mostrar el diseño al revés, sino que permanece en modo horizontal. Intenté esto con una aplicación HelloWorld muy simple. Agregué android:configChanges="orientation" al manifiesto y anulé onConfigurationChange() en la Actividad para establecer puntos de interrupción allí. Girar el dispositivo al revés produce un cambio de configuración para pasar de vertical (boca arriba) a horizontal, pero no hay un segundo cambio de horizontal a vertical (boca abajo). ¿Es este un problema de Android o hay algo que deba hacer?La rotación al revés no activa el cambio de configuración

Manifiesto:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="hello.world" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="10" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:configChanges="orientation" 
      android:name=".HelloWorldActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

Actividad:

public class HelloWorldActivity 
    extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    } 

    public void onConfigurationChanged(Configuration newConfig) 
    { 
    super.onConfigurationChanged(newConfig); 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    { 
     Log.e("MDO", "orientation change: landscape"); 
    } 
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
    { 
     Log.e("MDO", "orientation change: portrait"); 
    } 
    } 
} 
+1

¿Estás seguro de que tu dispositivo hace esto? Raramente veo aplicaciones que permiten esto. – DeeV

+0

No he visto este comportamiento con algunas aplicaciones estándar (Configuración, navegador, etc.) que probé, pero es posible con 'android: screenOrientation =" fullSensor "' –

Respuesta

7

No es un problema, es cómo funciona Android. Solo se ve al revés en modo horizontal y no en vertical (y en horizontal desde la versión 2.2 si no recuerdo mal). El cambio de configuración ocurre cuando va de vertical a horizontal y viceversa. Si desea verificar si el teléfono fue volteado boca abajo o en cualquier dirección, tendrá que acceder al sensor del acelerómetro. Aquí hay un tutorial sobre cómo usarlo y aquí tiene SensorManager docs.

EDIT: como el autor de la pregunta descubrió a sí mismo, añadiendo android:screenOrientation="fullSensor" a su manifiesta es suficiente, siempre que no desea nada para apoyar mayores de Android 2.3 (API de nivel 9).

+0

¿Tiene un enlace al documento de Android que describe esto? ? –

+2

En realidad, si agrego android: screenOrientation = "fullSensor" obtengo el comportamiento deseado. –

+0

El problema es que no se ejecutará en Androids anteriores a 2.3 (nivel de API 9). ¿O estoy equivocado? ¿Lo has probado? –

3

Incluir ScreenSize en sus configChanges en su mafifest:

android:configChanges="orientation|screenSize" 

De http://developer.android.com/guide/topics/resources/runtime-changes.html:

A partir de Android 3.2 (nivel de API 13), el "tamaño de pantalla" también cambia cuando el dispositivo cambia entre la orientación vertical y horizontal. Por lo tanto, si desea evitar que se reinicie el tiempo de ejecución debido al cambio de orientación cuando se desarrolla para API nivel 13 o superior (según lo declarado por los atributos minSdkVersion y targetSdkVersion), debe incluir el valor "screenSize" además del valor de "orientación". Es decir, debe descartar android: configChanges = "orientation | screenSize". Sin embargo, si su aplicación se dirige al nivel API 12 o inferior, su actividad siempre maneja esta configuración por sí misma (este cambio de configuración no reinicia su actividad, incluso cuando se ejecuta en un dispositivo con Android 3.2 o superior).

3

El ajuste android:screenOrientation="fullSensor" logra lo que intento hacer.

Cuestiones relacionadas