una talento recursos puestos puesto profesional perfil humanos humano gerente funciones empresa ejemplo descripcion conocimientos auxiliar android android-layout android-resources android-resolution

talento - ¿Qué parte de Android se encarga de elegir un perfil de recursos correcto?



perfil del gerente de talento humano (3)

Tengo un extraño problema.

Antes de que tengas una idea para arremeter contra mí, estoy trabajando en un Jelly Bean personalizado. Por lo tanto, los "buenos enfoques habituales" podrían no funcionar aquí, y deben hacerse soluciones sucias.

Tengo una APK que contiene lo siguiente en activos:

layout layout-mdpi layout-land layout-large-mdpi layout-large-land-mdpi layout-large-hdpi layout-large-xhdpi

Y algún otro código de métricas devolvió esto:

D/AppDemo( 2091): measured width: 1920 PE width: 1920 scaleFactor = 1.0 D/AppDemo( 2091): [ANDROID] measured width: 1920 measured height: 1080 D/AppDemo( 2091): [ANDROID] scale for resources: 2.0 xdpi: 320.0 ydpi: 320.0 D/AppDemo( 2091): [ANDROID] screen density: xhdpi D/AppDemo( 2091): [ANDROID] screen size: large D/AppDemo( 2091): [ANDROID] using layout: layout-mdpi

Entonces, mirando las métricas, ¿por qué no se carga layout-large-xhdpi ?

Por favor, dime dónde puedo buscar esto. Realmente necesito encontrar una forma de forzar al Layout / Resource / AssetManager a cargar un diseño específico.

Soy consciente de que el comentario más popular sobre este tema es "no necesitas / por qué tienes layout-xhdpi , debes tener drawable-xhdpi y layout-large ", pero drawable-xhdpi .

Agradecería incluso pequeños indicios de dónde mirar y qué buscar. Hasta ahora, AssetManager parece ser el lugar para comenzar a cavar / registrar.

Cuando layout-mdpi , la aplicación falla sobre mí, con recursos faltantes. El error parece ser que aunque el código devuelve xhdpi , asume mdpi en otro lugar. Necesito encontrar esto y arreglarlo para que mis aplicaciones se vean tan bien como lo hicieron en ICS :)

Estoy averiguando qué diseño se carga de una manera simple: todos los diseños de raíz tienen un elemento android:tag , y cuando setContentView(R.layout.main_layout) agarro la etiqueta en el elemento raíz y sé qué carpeta se cargó. Además de los comentarios visuales, esto eventualmente tendrá que coincidir con la configuración de mi dispositivo.

Gracias por adelantado.


No sé si te entiendo bien, estás construyendo un AndroidOS personalizado y quieres que este AndroidOS personalizado cargue siempre el mismo recurso de diseño, en tu caso layout-large-xhdpi?

Si es así, creo que ha personalizado la clase de configuración . Si lo quiere rápido y sucio, podría anular las Constantes int en la línea 72 y más abajo.

Concreto, cambio:

.... 100 public static final int SCREENLAYOUT_SIZE_LARGE = 0x03; 108 public static final int SCREENLAYOUT_SIZE_XLARGE = 0x04;

a:

.... 100 public static final int SCREENLAYOUT_SIZE_LARGE = 0x04; 108 public static final int SCREENLAYOUT_SIZE_XLARGE = 0x04;

Otra forma podría ser anular el Constructor y el método setToDefaults () - por lo que siempre carga la misma presentación de pantalla.

No lo probé, no sé si funciona, y no tengo fuentes creíbles y / o oficiales (se excluye el código oficial de Android), pero espero poder ayudarte.


Problema interesante. Eché un vistazo, pero todo se va un poco por el agujero del conejo. No hay respuesta como tal, pero tal vez mi análisis lo guiará en la dirección correcta.

Miré lo que pasó desde setContentView hacia adelante. Obviamente, en ese punto está hablando en términos de una referencia de disposición agnóstica de densidad (por ejemplo, R.layout.main_layout ) y luego se convertirá en una referencia a un archivo específico en el APK. Cuándo y dónde está tu pregunta.

Usé calificadores de paisaje / retrato para poder cambiar la calidad en tiempo de ejecución y usé un depurador con la fuente de Android adjunta.

Aquí hay un flujo, comenzando de alguna manera en él.

  1. Resources.getLayout (int)
  2. Resources.loadXmlResourceParser (int, String)
  3. Resources.getValue (int, TypedValue, boolean)
  4. AssetManager.getResourceValue (int, int, TypedValue, boolean)
  5. StringBlock.get (int)
  6. StringBlock.nativeGetString (int, int)

Trabajemos al revés.

El paso 6 es un método nativo (C) que devuelve la referencia calificada, por ejemplo, /res/layout-land/yourview.xml . Sin embargo, su parámetro es un índice, y esto cambia según que estemos en paisaje o retrato.

Para ver de dónde vino eso, tenemos que volver al paso 4. El índice es un campo dentro de TypedValue, pero inicialmente no está configurado correctamente cuando se transfiere a este método.

El paso 4 llama a otro método nativo, AssetManager.loadResourceValue() , que altera el pasado en TypedValue y establece el índice de manera apropiada.

Tal vez puedas empezar a buscar la C para eso y ver cómo te va.


Hay tantos dispositivos pirateados en el mercado como Micromax Funbook que tienen un tamaño de pantalla grande pero usan los recursos de mdpi. Confía en mí. He trabajado con ellos y fue muy frustrante.

Como mencionaste que tu aplicación funciona muy bien con cualquier otro dispositivo, simplemente no funciona con esta tableta portátil que quizás necesites implementar.

http://android-developers.blogspot.in/2011/07/new-tools-for-managing-screen-sizes.html

Debe leer el último segmento en esta página, seguramente lo ayudará.

para resumirlo aquí, el enfoque sugerido es crear un diseño separado con el nombre diferente usando los diferentes recursos por completo.

Usted dirige el proceso de selección de recursos aquí, no el sistema. que puede llevar mucho tiempo, pero seguramente ayudará.

public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(); Configuration config = getResources().getConfiguration(); if (config.smallestScreenWidthDp >= 600) { setContentView(R.layout.main_activity_tablet); } else { setContentView(R.layout.main_activity); } } }