Spanish Adaptando aplicacion para distintos dispositivos

psdos

Active Member
Licensed User
Longtime User
Buenas, pues vereis, ahora que ya termine mi aplicacion, la estoy intentando adaptar a varios terminales. La aplicacion la desarrolle para un Samsung Galaxy Note, y la he adaptado a un S2 sin problemas. El tema es que no tengo claro un asunto de los ListViews, y es que al adaptar su Activity.AddView es donde vienen las pegas al usar varios terminales.

Yo he puesto estas dos lineas para adaptarlo al Note y al S2

B4X:
'ListView1.SingleLineLayout.ItemHeight vale 30 para un Galaxy S2 y 40 para el Note
   If ListView1.SingleLineLayout.ItemHeight = 30 Then Activity.AddView(ListView1,0, 590, 240, 210) ' Valor de la posicion de representacion del ListView, X, Y, ancho, alto
   If ListView1.SingleLineLayout.ItemHeight = 40 Then Activity.AddView(ListView1,0,920,400,360) 'Configuracion para el Note

El problema es al intentar adaptarlo a un Galaxy Tab, en este caso la propiedad ListView1.SingleLineLayout.ItemHeight tambien vale 30 como en Galaxy S2, pero no coinciden las resoluciones, asi que lleva otros ajustes. ¿Como haceis vosotros este tipo de operaciones para adaptar vuestros programas a distintos dispositivos?

Muchas gracias.
 

psdos

Active Member
Licensed User
Longtime User
Pues he probado usando dip, como me han comentado, pero los valores varian de un dispositivo a otro y no queda ajustado el ListView. Algun consejo por favor?

Un saludo.
 

joseluis

Active Member
Licensed User
Longtime User
Combínalo con valores porcentuales. Por ejemplo:

' Esto pondría una listview con un 10% de margen a cada lado
Activity.AddView(ListView1, 10%x, 20%y, 80%x, 60%y)
' Esto pondría una etiqueta de 200x40dip centrada verticalmente en el borde derecho:
Label1.AddView(Button1, 100%x - 200dip, 50%y-20dip, 200dip, 40dip)

' Para hacer más virguerías, puedes usar Max() y Min()
' Por ejemplo Max(10%x, 200dip) te devolvería el valor más grande: o bien el 10% de x o 200dip

etc...
 

psdos

Active Member
Licensed User
Longtime User
Gracias joseluis por tu respuesta. Una cosa mas, por que una correlacion exacta no existe entre resolucion y escala verdad? Yo tengo por ejemplo ahora mismo tres dispositivos de Samsung

Resolucion del Galaxy S2 -> 480x800, scale = 1.5 (240dpi)
Resolucion del Galaxy Note -> 588x960, scale = 1.5 (240dpi)
Resolucion del Galaxy Tab -> 600x1024, scale = 1.5 (240dpi)

hasta ahora detectaba el valor de Top de una Label para saber que dispositivo estaba ejecutando la app y en funcion de eso adaptaba los valores del ListView tal que así.

B4X:
'Miramos la coordenada Top de la Label7 para saber en que dispositivo estamos ejecutando la aplicacion.
   If Label7.Top = 489 Then
      Activity.AddView(ListView1,0, 590, 240, 210)'Configuracion para el S2. Valor de la posicion de representacion del ListView, X, Y, ancho, alto
   End If
   
   If Label7.Top = 780 Then
      Activity.AddView(ListView1,0,920,400,360) 'Configuracion para el Note.
   End If
   
   If Label7.Top = 593 Then
      Activity.AddView(ListView1,0,700,300,325) 'Configuracion para el Tab.
      ListView1.SingleLineLayout.ItemHeight = 25dip
      ListView1.SingleLineLayout.Label.TextSize = 14
      ListView1.SingleLineLayout.Label.Top = 3
      Label6.TextSize = 14
   End If

Y probe la opcion de dip que me comento el compañero en el Note y me aparece centrado con estos valores

B4X:
Activity.AddView(ListView1,0dip,460dip,200dip,180dip)

Luego las coordenadas para el note en el "Designer" del ListView1 en modo portrait son
Left=0
Top=690
Width=300
Height=270

Me gustaria saber si hay alguna manera de calcular los valores sin hacer pruebas usando quizas lo que me indicas.

Un saludo y mil gracias.
 
Last edited:

joseluis

Active Member
Licensed User
Longtime User
Hummm no hay fórmulas mágicas.


1) Hay 4 categorías generales de tamaño de pantalla:
- small (al menos 426 x 320)
- normal (al menos 640 x 480)
- large (al menos 470 x 320.)
- xlarge (al menos 960 x 720)

Como ves hay cierto solapamiento afectando incluso a la frontera entre aquellos dispositivos que se considerarían tablets y los que se considerarían teléfonos.


2) Hay 4 categorías generales de densidades
- ldpi (~120ppp) (escala 0.75)
- mdpi (~160ppp) (escala 1)
- hdpi (~240ppp) (escala 1.5)
- xhdpi (~320ppp) (escala 2)


los dip son pixeles independientes de la densidad. 1 dip equivale a 1 pixel en resolución de 160ppp. O lo que es lo mismo dip = escala * pixeles. Son útiles para obtener un tamaño relativo similar en diferentes densidades. Aunque me suena haber oído que en algún dispositivo funcionaba mal, por tener una densidad rara, o mal clasificada.

En teoría podría haber cualquier combinación. Y cada desarrollador tiene su sistema. Desde los que usan cientos de layots hechos a mano adaptados a cada dispositivo diferente, pasando por los que tienen un puñado de categorías que intentan cubrir todas las posibilidades, hasta los que lo hacen con fórmulas.

Yo personalmente intento hacerlo todo con fórmulas de forma general, pero el programa que estoy haciendo todavía lo estoy probando sólo en mi teléfono, así que aún no me he encontrado casos límite.
 

psdos

Active Member
Licensed User
Longtime User
Pues entonces joseluis no parece muy descabellado mi idea de usar una variable de posicion para determinar en que dispositivo estamos, a fin de cuentas solo me encontre con este problema de los ListViews, que no se el por que difieren su diseño con si inicializacion, cosas de android jeje.

Muchas gracias por tus aclaraciones, me van a ser de mucha ayuda en futuros programas. Oye aunque un poco offtopic, tu sabes si se puede proteger una base de datos SQL hecha con SQLite Expert Personal 3 free edition? es que por mas que miro, no veo nada en referencia a protegerla.

Un saludo y mil gracias una vez mas compañero.
 

joseluis

Active Member
Licensed User
Longtime User
Yo de bases de datos sólo sé que no se nada, porque todavía no me he puesto con ellas :)

Saludos
 
Top