studio recursos getresources android android-layout android-resources android-screen-support

recursos - r.id android studio



Desigualdades de diseño y valores de selección de recursos de Android (2)

Estoy haciendo una aplicación para Android 4.0.3. si usa sw600dp, sw720dp, ¿es necesario utilizar el siguiente ?: - values-sw600dp-port default-config.xml
- values-sw600dp-land default-config.xml
- values-sw700dp-port default-config.xml
- values-sw700dp-land default-config.xml porque no estoy usando res / values-XXX y parece que funciona bien.

El problema que estoy experimentando indica que el depósito de recursos que se selecciona para el XML de layout una actividad determinada no es coherente con los recursos que se seleccionan de la carpeta de values pesar de que se usan los mismos calificadores de recursos en cada conjunto de carpetas.

Ejemplo

Después de colocar algún código de registro dentro de la actividad principal abstracta de mi aplicación, puedo ver que al iniciar mi aplicación sobre un emulador de tipo Nexus 7 (Android 4.1) el ancho más pequeño es de hecho 600dp, la carpeta layout-sw600dp-* se usa para buscar la UI para la actividad pero la carpeta que se usa para los values es values-large-* . Esperaba que esto fuera values-sw600dp-* tanto, me proporcionó la información vital en cuanto a qué values-sw600dp-* recursos se está ejecutando la actividad.

Código que realiza el registro dentro de la actividad principal de mi aplicación para todos los android.app.Activity s

protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Configuration config = getResources().getConfiguration(); Log.i(this.getClass().getSimpleName(), String.format("Smallest width is [%s]", config.smallestScreenWidthDp)); configurationContext = SupportedDeviceConfiguration.fromResourceQualifer(getString(string.resourceQualifier)); Log.i(this.getClass().getSimpleName(), String.format("Running under the [%s] configuration context.", configurationContext.getResourceQualifier())); ...

Logging output desde cuando ejecuto este código en un dispositivo de tipo Nexus 7;

[Logging fluff] Smallest width is [600] [Logging fluff] Running under the [layout-large-land] configuration context.

Sé lo que estás pensando, ¿de dónde viene esa derivación de maquetación de gran extensión ? Sigue leyendo ...

Fondo

Estoy probando un enfoque descrito here que me permitiría inspeccionar el cubo de recursos bajo uso en tiempo de ejecución. Esencialmente, el enfoque que he implementado tiene la siguiente estructura de calificadores de recursos;

- res + layout // Default portrait layout. + layout-land // Default landscape layout + layout-large-land // pre 3.2 phablet landscape layout (Galaxy Note at v2.3.3) + layout-xlarge-land // pre 3.2 tablet landscape layout + layout-xlarge-port // pre 3.2 tablet portrait layout + layout-sw520dp-port // post 3.1 phablet portrait layout (Galaxy Note at v4.0.3) + layout-sw520dp-land // post 3.1 phablet landscape layout + layout-sw600dp-port // post 3.1 mini-tablet portrait layout (Nexus 7) + layout-sw600dp-land // post 3.1 mini-tablet-landscape layout + layout-sw700dp-port // post 3.1 tablet portrait layout + layout-sw700dp-land // post 3.1 tablet landscape layout - values // Contains the root strings.xml strings.xml - values-land default-config.xml - values-large-land default-config.xml - values-xlarge-land default-config.xml - values-xlarge-port default-config.xml - values-sw520dp-port default-config.xml - values-sw520dp-land default-config.xml - values-sw600dp-port default-config.xml - values-sw600dp-land default-config.xml - values-sw700dp-port default-config.xml - values-sw700dp-land default-config.xml

Entonces, esencialmente, los calificadores de values reflejan el de los calificadores de layout . Debajo de cada una de las carpetas values-* , he definido un solo archivo XML llamado device-config.xml con contenido;

<?xml version="1.0" encoding="utf-8"?> <resources> <string name="resourceQualifier">layout-{qualifier of values folder}</string> </resources>

Entonces, por ejemplo, el device-config.xml la carpeta values-sw600dp-land contiene una sola cadena con valor layout-sw600dp-land . El objetivo aquí es que mi código permanezca sincronizado con los diseños de recursos que se muestran en la pantalla. Esto es necesario para que mi código no muestre "encontrar por identificación" algún elemento que no exista en el diseño mostrado debido a la propiedad inmobiliaria involucrada.

(Opcional) Razonamiento más profundo de por qué estoy haciendo esto

El razonamiento más profundo para querer saber el cubo que se usa en tiempo de ejecución nació de la constatación de que mi código de fragmento único para todas las configuraciones era cada vez más difícil de manejar con varias lógicas basadas en conmutadores que no eran transparentes y con frecuencia duplicadas. otros diseños ... era como si necesitara algún tipo de Herencia de Fragmentos ... que si sigues el enlace es exactamente lo que hice. La desventaja de esto es que necesito saber con qué pantalla estoy trabajando antes de instruir al framework para crear una instancia del fragmento x, y, z sabiendo que el Fragmento que se está creando nunca estará fuera de sincronización con el diseño. está destinado a inflarse Esta herencia funciona y permite una pila de fragmentos mucho más manejable (Sonar también está más feliz, lo que es bueno).

Resumen

Sin embargo, me he visto frustrado por esta aparente discrepancia entre la carpeta de diseño y la carpeta de valores que selecciona el marco. Cada uno tiene los mismos calificadores, por lo tanto, ¿por qué una Actividad que aprovecha el XML de la interfaz de usuario layout-sw600dp-land utiliza el recurso values-sw600dp-land ? Espero que algo esté mal porque fue la mejor de las posibles soluciones publicadas en la discusión SO a la que me he vinculado anteriormente.


Estoy seguro de que está tratando con la precedencia de recursos utilizada para la selección.

Si proporciona carpetas:

layout-sw600dp-* values-large-* values-sw600dp-*

Android no está obligado a hacer coincidir la carpeta de selección de valores con los del diseño , sino que usa la misma lógica de precedencia por separado para el diseño y separadamente para la carpeta de valores.

Puede obtener más información sobre este algoritmo de selección aquí: http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch