Selección de recursos de Android y valores e inconsistencias

El problema que estoy experimentando indica que el cubo de recursos que se selecciona para el XML de una presentación de la actividad es inconsistente con los recursos que se seleccionan de la carpeta de values pesar de los mismos calificadores de recursos que se utilizan en cada conjunto de carpetas.

Ejemplo

Después de colocar algún código de registro en la actividad de los padres de mi aplicación abstracta 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 600dp, la carpeta layout-sw600dp-* se utiliza para buscar la interfaz de usuario Para la actividad, pero la carpeta que se utiliza para los values es values-large-* . Esperaba que esto fuera values-sw600dp-* proporcionándome así la información vital en cuanto a qué cubo de recursos la actividad se está ejecutando bajo.

Código que realiza el registro en 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())); ... 

Registro de salida de cuando ejecuto este código en un dispositivo tipo Nexus 7;

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

Sé lo que usted está pensando – ¿de dónde provino esa disposición- derivación de la tierra grande ? Sigue leyendo …

Fondo

Estoy probando un enfoque descrito aquí que me permitiría inspeccionar el cubo de recursos en 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 

Así que esencialmente los calificadores de values reflejan el de los calificadores de layout . Bajo cada una de las carpetas values-* he definido un único 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> 

Por ejemplo, el device-config.xml la carpeta de 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 salga de "encontrar por id" algún elemento que no existe en el diseño mostrado debido a los bienes raíces involucrados.

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

El razonamiento más profundo para querer saber el cubo que se utiliza en tiempo de ejecución nació de la comprensión de que mi código de un solo fragmento para todas las configuraciones se estaba convirtiendo en difícil de manejar con varios lógica basada en conmutador que no era transparente ya menudo duplicado características de Otros diseños … era como si necesitara algún tipo de Herencia de Fragmento … que si sigues el enlace es exactamente lo que hice. El inconveniente de esto es que necesito saber con qué pantalla estoy trabajando antes de instruir el framework para instanciar el fragmento x, y o z, seguro al saber que el Fragmento que se está creando nunca estará fuera de sincronización con el diseño Está destinado a inflar. Esta herencia funciona y permite una pila de fragmentos mucho más manejable (Sonar es más feliz también lo que es agradable).

Resumen

Sin embargo, he sido frustrado por esta aparente discrepancia entre qué carpeta de diseño y la carpeta de valores que el marco selecciona. Cada uno tiene los mismos calificativos, por lo tanto, ¿por qué una Actividad que aprovecha el XML de layout-sw600dp-land UI utiliza el recurso values-sw600dp-land ? Espero tener algo mal porque era la más limpia de las soluciones potenciales publicadas en la discusión de SO a la que he vinculado anteriormente.

Estoy seguro de que se trata de la prioridad de los recursos utilizados para la selección.

Si proporciona carpetas:

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

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

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

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

  • Densidades y tamaños en tablets android
  • Configuración de carpeta de dibujar para utilizar para diferentes resoluciones
  • Cómo definir dimens.xml para cada tamaño de pantalla diferente en android?
  • Cómo definir el nombre de la carpeta para varias resoluciones de pantalla (conflicto entre Nexus 10 y Galaxy Tab 10)?
  • Cómo restringir la aplicación sólo a teléfonos Android
  • Los dibujos se leen siempre desde la carpeta mdpi, independientemente del tamaño de la pantalla
  • Disposición de Android con vista a la derecha que ocupa un espacio preestablecido y visualiza en las escalas de la izquierda para llenar el resto de la pantalla hasta cierto límite
  • cómo redimensionar automáticamente, compatible, ajustar el tamaño de pantalla para todos los dispositivos android
  • Soporte de pantalla de manifiesto Entrada sólo para dispositivos y sólo para tabletas
  • Resoluciones de pantalla de Android
  • ¿Cómo saber el ancho más pequeño (sw) del dispositivo android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.