2011-11-16 9 views
6

Mi chiedevo come posso cambiare il tema di un'attività a seconda se il dispositivo è un tablet o un telefono. Ho un'attività di impostazioni con un tema @android:style/Theme.Black.NoTitleBar. Sul tablet mi piacerebbe che il tema di questa attività fosse qualcosa come @android:style/Theme.DialogUtilizzare un tema diverso a seconda se il dispositivo è un tablet o telefono Android

Ho scelto il tema dell'attività nel file Manifest.xml, ma come posso vedere non esiste una versione tablet di questo file manifest?

Come posso modificare il tema di questa attività? Potrei anche cambiare il tema per alcune altre attività e nascondere la barra delle azioni.

risposta

9

è possibile impostarlo in modo dinamico all'interno di ogni attività come questa:

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); 
} 

Ora è necessario il metodo isTablet ma è difficile rilevare il tipo di dispositivo. Ecco un metodo che ho trovato online, controlla le dimensioni dello schermo e se lo schermo è grande assume che il dispositivo corrente sia un tablet .:

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

Grazie, ha funzionato perfettamente! – Georg

10

È possibile descrivere un tema personalizzato (che potrebbe semplicemente indicare un tema predefinito) in un s tyle resource file e quindi fare riferimento a quel tema nel Manifest.

Quindi, è possibile fornire alternative resources in base a determinati criteri (proprio come con drawable di diversa densità, ma ora si dovrebbe specificare la dimensione minima dello schermo o il livello API, ad esempio).

Manifext:

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

res/valori/styles.xml:

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

res/valori-V11/styles.xml:

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

Grazie per l'idea. Il problema principale è che voglio solo attività specifiche per essere una finestra di dialogo o un'attività a schermo intero basata su se il dispositivo è un tablet o meno. Al telefono l'attività sarebbe in una barra delle schede, sul tablet è una finestra di dialogo. Con la tua soluzione non riesco a vedere come potrei realizzarlo. – Georg

+1

@Georg: puoi provare a specificare il tema Android: per lo specifico elemento . – ron

+0

Vuoi dire che dovrei scegliere un tema per ogni attività e "sovrascrivere" quelli necessari per il tablet nei valori -xlarge/style.xml? – Georg

Problemi correlati