2011-11-16 10 views
6

Me preguntaba cómo puedo cambiar el tema de una actividad dependiendo de si el dispositivo es una tableta o un teléfono. Tengo una actividad de configuración que tiene un tema @android:style/Theme.Black.NoTitleBar. En la tableta me gustaría que el tema de esta actividad sea algo así como @android:style/Theme.DialogUsar un tema diferente dependiendo de si el dispositivo es una tableta o teléfono Android

Elegí el tema de la actividad en el archivo Manifest.xml pero, como puedo ver, no hay una versión en tableta de este archivo de manifiesto.

¿Cómo puedo cambiar el tema de esta actividad? También podría cambiar el tema para otras actividades y así ocultar la barra de acciones.

Respuesta

9

Es posible ajustar de forma dinámica dentro de cada actividad como esta:

protected void onCreate(Bundle icicle) { 

    super.onCreate(icicle); 

    // ... 

    // Call setTheme before creation of any(!) View. 

    if(isTablet()) { 
     setTheme(android.R.style.Black); 
    } 
    else { 
     setTheme(android.R.style.Theme_Dark); 
    }  
    // ... 

    setContentView(R.layout.main); 
} 

Ahora necesita el método isTablet pero es un poco difícil detectar el tipo de dispositivo. Aquí hay un método que encontré en línea, comprueba el tamaño de la pantalla y si la pantalla es grande, asume que el dispositivo actual es una tableta .:

public boolean isTablet() { 
    try { 
     // Compute screen size 
     DisplayMetrics dm = context.getResources().getDisplayMetrics(); 
     float screenWidth = dm.widthPixels/dm.xdpi; 
     float screenHeight = dm.heightPixels/dm.ydpi; 
     double size = Math.sqrt(Math.pow(screenWidth, 2) + 
           Math.pow(screenHeight, 2)); 
     // Tablet devices should have a screen size greater than 6 inches 
     return size >= 6; 
    } catch(Throwable t) { 
     Log.error(TAG_LOG, "Failed to compute screen size", t); 
     return false; 
    } 

} 
+0

¡Gracias, eso funcionó a la perfección! – Georg

10

Puede describir un tema personalizado (que simplemente podría apuntar a un tema predeterminado) en un s tyle resource file, y luego hacer referencia a ese tema en el Manifiesto.

Luego, puede proporcionar alternative resources en función de algunos criterios (al igual que con los modelos de densidad diferente, pero ahora debe especificar el tamaño mínimo de pantalla o el nivel de API, por ejemplo).

Manifext:

<application android:theme="@style/CustomTheme"> 

res/valores/styles.xml:

<style name="CustomTheme" parent="android:Theme.Black.NoTitleBar" /> 

res/valores-v11/styles.xml:

<style name="CustomTheme" parent="android:Theme.Dialog" /> 
+0

Gracias por la idea. El principal problema es que solo quiero que una Actividad específica sea un diálogo o una actividad de pantalla completa en función de si el dispositivo es una tableta o no. En el teléfono, la actividad estaría en una barra de pestañas, en la tableta es un diálogo. Con su solución no veo cómo podría lograr eso. – Georg

+1

@Georg: puede intentar especificar el tema android: para el elemento específico. – ron

+0

¿Quiere decir que debería incluir un Tema para cada actividad y "anular" las que necesito para la tableta en los valores-xlarge/style.xml? – Georg

Cuestiones relacionadas