2011-04-20 20 views
82

Acabo de implementar la función de cambio de orientación.¿Cómo detectar el cambio de orientación en el diseño en Android?

Cuando el diseño cambia de vertical a horizontal (o viceversa), ¿cómo puedo detectar cuándo finalizó el evento de cambio de orientación?

Intenté usar OrientationEventListener, pero parece que no es una buena idea.

Solo quiero que se me notifique cuando cambie la orientación del diseño. ¿Como hacer eso? Método

+0

En mi caso, onCreate() se llama cuando cambia de orientación. –

Respuesta

238

Uso del onConfigurationChanged método de la Actividad. Véase el siguiente código:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
     Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
    } 
} 

También tiene que editar el elemento apropiado en el archivo de manifiesto de incluir el androide: configChanges Sólo hay que ver el código de abajo:

<activity android:name=".MyActivity" 
      android:configChanges="orientation|keyboardHidden" 
      android:label="@string/app_name"> 

NOTA: con Android 3.2 (nivel de API 13) o superior, 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 el reinicio del tiempo de ejecución debido al cambio de orientación al desarrollar para el nivel API 13 o superior, debe declarar android: configChanges = "orientation | screenSize" para el nivel API 13 o superior.

Hope esto le ayudará a ... :)

+3

Esto es bueno, pero primero carga el xml del diseño en la carpeta layout-land y utiliza los archivos de diseño portrait xml. – Programmer

+17

Aztec Coder, cuando se incluye "android: configChanges =" orientation "está declarando que manejará el cambio de orientación, lo que significa que su actividad no se volverá a crear cuando cambie a landscape. En cambio, se llama a onConfigurationChanged. Si esto es no deseado, puede usar una variable para recordar la orientación de su actividad y cada vez que vaya a OnPause (por ejemplo) para verificar si la orientación sigue siendo la misma. – Elena

+0

si se especifican varios elementos en android: configChanges, cualquier forma de distinguir entre ellos ? – njzk2

11

Para cargar el diseño de la disposición tierra carpeta significa que tienen dos diseños separados entonces usted tiene que hacer setContentView en onConfigurationChanged método.

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     setContentView(R.layout.yourxmlinlayout-land); 
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
     setContentView(R.layout.yourxmlinlayoutfolder); 
    } 
} 

Si solo tiene un diseño, entonces no es necesario hacer que setContentView en este método. simplemente

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
} 
+18

En lugar de sobrescribir, solo usa el diseño/main.xml y layout-land/main.xml. –

+0

@JaredBurrows: Por favor, consulte http://stackoverflow.com/questions/23789605/why-is-my-orientation-change-going-unnoticed –

+0

Quería detectar que mi actividad había finalizado debido a una rotación de pantalla. Implementé el método 'onConfigurationChanged (Configuration newConfig)' (como en esta respuesta), pero en lugar de manejarlo yo mismo, establecí un indicador booleano y luego llamé al método 'recrear()' para que Android recreara la actividad en su forma normal . – dazed

11

Sólo quería mostrarte una manera de salvar a toda su paquete después de onConfigurationChanged:

Crear nuevo paquete justo después de su clase:

public class MainActivity extends Activity { 
    Bundle newBundy = new Bundle(); 

A continuación, después de "protected void onCreate" Añada esto:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
      onSaveInstanceState(newBundy); 
     } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 
      onSaveInstanceState(newBundy); 
     } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putBundle("newBundy", newBundy); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    savedInstanceState.getBundle("newBundy"); 
} 

Si agrega esta todas sus clases de crated en MainAc tivity se guardará.

Pero la mejor manera es añadir esto en su AndroidManifest:

<activity name= ".MainActivity" android:configChanges="orientation|screenSize"/> 
+6

Esto es engañoso. La implementación 'onConfigurationChanged()' lo hace para que su instanciaState no se destruya cuando cambia la orientación, por lo que no tiene que guardarla. Es posible que desee guardarlo para otros eventos en el ciclo de vida de la actividad, pero no sé. – izzy

2

uso de este método

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
    { 
     Toast.makeText(getActivity(),"PORTRAIT",Toast.LENGTH_LONG).show(); 
     //add your code what you want to do when screen on PORTRAIT MODE 
    } 
    else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    { 
     Toast.makeText(getActivity(),"LANDSCAPE",Toast.LENGTH_LONG).show(); 
     //add your code what you want to do when screen on LANDSCAPE MODE 
    } 
} 

y no se olvide agregar este en su Androidmainfest.xml

android:configChanges="orientation|screenSize" 

como esto

<activity android:name=".MainActivity" 
      android:theme="@style/Theme.AppCompat.NoActionBar" 
      android:configChanges="orientation|screenSize"> 

    </activity> 
Cuestiones relacionadas