2012-07-30 14 views
5

uso diferentes diseños para diferentes tamaños de pantalla y dispositivos. Yo uso Fragmentos con Carpetas de Diseño específicas. El concepto es genial, para tabletas y dispositivos con una pantalla grande coloco un archivo de diseño en layout-sw600dp y Android se las arregla para entregar el diseño correcto en los diferentes dispositivos.¿Cuál es la mejor manera de separar diferentes lógicas de programación para diferentes diseños en Android?

Lo que me molesta es: ¿Cómo puedo saber qué diseño se usa dentro de mi Código? My Fragments necesita códigos ligeramente diferentes para los diferentes diseños.

En general, ¿cuál es la mejor práctica para separar la lógica de programación de diseño personalizado dentro de mis fragmentos/actividades?

Mi enfoque ahora es bastante hacky y no está sincronizado con las diferentes carpetas de diseño.

private boolean isTabletDevice() { 
    if (android.os.Build.VERSION.SDK_INT >= 11) { // honeycomb 
     // test screen size, use reflection because isLayoutSizeAtLeast is 
     // only available since 11 
     Configuration con = getResources().getConfiguration(); 
     try { 
     Method mIsLayoutSizeAtLeast = con.getClass().getMethod("isLayoutSizeAtLeast", int.class); 
     Boolean r = (Boolean) mIsLayoutSizeAtLeast.invoke(con, 0x00000004); // Configuration.SCREENLAYOUT_SIZE_XLARGE 
     return r; 
     } catch (Exception x) { 
     x.printStackTrace(); 
     return false; 
     } 
    } 
    return false; 
    } 

y luego

if(isTabletDevice()) { 
//findViewById(R.id.onlyInTabletLayoutButton); 
}else{ 
// 
} 

Respuesta

2

Este es el método que utilizo personalmente:

En cada diseño, agrego un Tag a la raíz de la disposición, y asegúrese de que todas las raíces de diseño tienen el mismo carné de identidad. Así, por ejemplo, voy a tener un diseño que dice algo como:

<RelativeLayout 
android:id="@+id/rootView" 
android:tag="landscapehdpi"> 
<!-- Rest of layout --> 
</RelativeLayout> 

Y luego tener otro como:

<RelativeLayout 
android:id="@+id/rootView" 
android:tag="portraitmdpi"> 
<!-- Rest of layout --> 
</RelativeLayout> 

A continuación, una vez que el diseño ha sido inflado, utilizo:

View rootView = (View) findViewById(R.id.rootView); 

Esto devuelve la raíz del diseño actualmente en uso.Ahora para determinar qué presentación es exactamente y ejecutar el código apropiado, utilizo una serie de bloques else if-:

String tag = rootView.getTag().toString(); 

if(tag.equals("landscapehdpi")) 
{ 
//Code for the landscape hdpi screen 
} 
else if(tag.equals("portraitmdpi")) 
{ 
//Code for the portrait mdpi screen 
} 
//And so on... 

Así que, básicamente, el uso de este se puede saber qué diseño se ha cargado en tiempo de ejecución, y ejecutar el apropiado código.

1

creo que busca la misma solución que aquí esta cuestión,

How can I detect which layout is selected by Android in my application?.

si desea ver la mejor respuesta, hay dos opciones disponibles.

  1. La primera es usar config para su carpeta de valores y de allí obtener el String de su archivo xml y verificarlo. (Para usarlo como una bandera).

https://stackoverflow.com/a/11670441/603744

  1. Y el siguiente es fijar la etiqueta a sus diseños, y obtener la etiqueta de su código para averiguar qué etiqueta que se imprime y sobre la base de que encontrar el diseño lo que se ha utilizado . Pero también debe tener en cuenta que hay un pequeño error en este enfoque. Pero aún no los he cansado.

https://stackoverflow.com/a/11205220/603744

Cuestiones relacionadas