2010-11-30 14 views
19

imaginar una pantalla completa dispositivo Android, lo quiero dividida en dos secciones:¿Cómo crear dos vistas en Android que usan 50% de altura cada una, a menos que una sea más pequeña?

  1. La mitad superior tiene texto en él, que puede ser mayor que el espacio disponible (o no) y por lo que el texto se desplazará (es decir, TextView dentro de un ScrollView)
  2. La mitad inferior contiene un control MapView.

Mirando específicamente a algunos escenarios:

  1. Si el texto es pequeño, quiero el mapa para ocupar más espacio, es decir, más del 50%. Entonces quizás un 20% de texto, un 80% de mapa.
  2. Si el texto es más grande, solo ocupará un MÁXIMO del 50% del espacio de la pantalla y luego se desplazará. Entonces 50% mapa, 50% texto.

Por el momento he asignado pesos a las dos partes, y eso no es tan malo, pero si el texto es pequeño, el mapa no se expande para tomar el espacio, y el diseño tiene una brecha desaprovechada que el mapa podría usar de manera útil.

He intentado muchas combinaciones, pero no puedo ver cómo hacer que esto suceda. Parece ser una experiencia común para mí saber lo que quiero, pero no puedo ver cómo obtener las vistas disponibles para entregarlo. Espero que haya una buena manera fácil de hacer esto.

dude en hacerme quedar como un tonto y señalar el atributo obvio que me he perdido :-)

=================== =============================================== =

Por lo que puedo ver, no hay forma de hacer esto solo en XML declarativo y necesita hacerlo en el código. Establecí la altura de la sección de texto en wrap_content, weight en 0 (sin cambio de tamaño), y tengo el mapa establecido en weight = 1 (es decir, ocupa el espacio restante). Luego compruebo si la sección de texto (en una Vista de desplazamiento) está ocupando demasiado espacio y, de ser así, lo reduzco. Este código debería cambiar para admitir una orientación de diseño diferente.

private void fixLayoutProportions() 
{ 
    float maxPercentageOfScreenForText = 50/100; 
    LinearLayout container = (LinearLayout)findViewById(R.id.container); 
    ScrollView eventText = (ScrollView)findViewById(R.id.text_scroller); 
    int heightAvailable = container.getHeight(); 
    int scrollerHeight = eventText.getHeight(); 
    if (scrollerHeight>(heightAvailable*maxPercentageOfScreenForText))  // Text section using too much space 
    { 
     eventText.getLayoutParams().height = (int)(heightAvailable*maxPercentageOfScreenForText) ; 
     eventText.invalidate(); 
    } 
} 
+0

Traté de hacer esto también y finalmente dejé de hacerlo de una manera muy inteligente, mi solución fue configurar la altura máxima de desplazamiento vertical utilizando inmersiones en la mitad de la pantalla, mediante el uso sumerge lo ajusta lo mejor posible. Por supuesto, necesita un diseño para el retrato y otro para el paisaje. Dejé esto como un comentario, ya que realmente no es tan bueno de una solución. – blindstuff

Respuesta

3

¿trató de medir la altura de la pantalla en tiempo de ejecución:

Display display = ((WindowManager) 
     getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
int width = display.getHeight(); 

A continuación, establezca su vista superior max_height al ancho * 0.5 y MIN_HEIGHT al ancho * 0.2. Su vista superior tiene que ser de control (como TextView) que tiene propiedades min_height y max_height. Además, establezca layout_weight en 0 o déjelo vacío. En la vista inferior, establezca el peso de la disposición en 1.

+0

Sospecho que tendré que hacer esto, pero sería más fácil si las vistas de diseño proporcionan una forma para que la aplicación lo haga de manera declarativa. –

+0

Esto no es muy elegante. Hay formas mucho mejores de hacerlo (como usar el layout_weight). – EboMike

+0

@EboMike No veo ninguna manera de hacer esto sin tener el código establecido a la altura de las dos secciones. El peso de Android View funciona muy bien para establecer un tamaño relativo, pero mis criterios simplemente no parecen estar cubiertos. –

0

no he probado esto, pero me intenta configurar el ScrollView tener android:layout_weight="1" y su MapView tener android:layout_weight="0" y una android:minHeight="240dp". La esperanza es que minHeight tenga prioridad sobre layout_weight.

+0

No estoy seguro de por qué está sugiriendo 240dp?La aplicación debe funcionar en todos los tamaños de pantalla, por lo que para forzar un tamaño estático necesitaría usar código para extraer la altura de la pantalla y calcularla, lo que me gustaría evitar si es posible. –

+0

Porque el% de edad del elemento primario no se admite como unidad de medida. Sí, tendrías que configurar esto en código. –

+0

No funcionó por desgracia. –

11

Puede hacerlo poniendo todo en LinearLayout y el cambio de los parámetros siguientes:

+0

¿Cómo? ¿Puede dar un ejemplo? No veo cómo sería útil establecer un peso total en LinearLayout? ¿Para qué debo establecer los pesos del niño para que se equilibren de la manera que necesito? –

+1

Establezca la suma de pesos, por ejemplo, en "4". Puedes hacerlo en un archivo xml (android: weightSum = "4"). Si quieres tener 50% - 50%, las vistas deben tener android: layout_weight = "2". Si quieres tener un 75% - 25%, las vistas deben tener android: layout_weight = "3" y android: layout_weight = "1". Por código, puede hacer: ((LinearLayout.LayoutParams) child.getLayoutParams()). Weight = 2.0f; parent.requestLayout(); –

+0

Esto no funciona, ya que no se adapta a la situación en la que el texto es muy pequeño, el mapa todavía solo ocupa el porcentaje especificado. p.ej. si el texto está configurado para usar 50% y asignar 50%, entonces si el texto realmente solo necesita 20%, el mapa no se expande para usar el espacio. –

0

bien, ya veo que es algo como u está reservando a media máxima de ur pantalla al TextView y si es más tiene que desplazarse. Tengo una solución, pero para eso tendrá que arreglar el máximo n. ° de líneas para TextView, calculando cuál puede ser un problema: P pero tenga una solución.

archivo main.xml archivo

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:scrollbars="vertical" 
    android:maxLines="5" 
    android:id="@+id/tv1" 
    android:text="wsdvsv sjdgv jsdvn ksdjbn skjdb ksdnbk snbk snbjksn fkbj sfkbjn dfkjbndkjfbn kdjfnb kjdfnbkjdnfbk ndf bjkndf bndfjbn dfkbn jdfnbjdfnbjdfn bjdf nbkjdnf bkjdfnb kjdnfbkjdfn bkjndfbjndfjbndkjfbn dkfjbn kdjfnb kjdfnbkjdfnbjkd nfkjbndf" 
    /> 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_below="@id/tv1" 
    android:layout_height="wrap_content" 
    android:scrollbars="vertical" 
    android:maxLines="5" 
    android:text="Does it work ???" 
    /> 
</RelativeLayout> 

Java:

package com.android; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.method.ScrollingMovementMethod; 
import android.widget.TextView; 

public class TestActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView tv = (TextView) findViewById(R.id.tv1); 
     tv.setMovementMethod(new ScrollingMovementMethod()); 
    } 
} 

Si el texto es decir sólo en 2 líneas "¿Funciona?" se desplazará automáticamente. Sin embargo, el único problema que veo aquí es las líneas máximo a 5 es que puede un valor máximo para u supongo que esto puede funcionar bien :)

BR, J

P. S. No he respondido muchas preguntas antes, así que no estoy seguro de cómo adjuntar archivos :(

+0

Extraño no puedo ver el archivo main.xml correctamente en esto sin embargo, si edito la publicación es visible correctamente. Entonces, en caso de confusión simplemente use la vista de texto anterior con un desplazamiento y agregue cualquier vista debajo de él. –

+0

Debe resaltar el código y presionar CTRL + K para formatearlo correctamente. Usa la vista previa la próxima vez. – EboMike

0

Creo que tiene que establecer la altura de las vistas de mapas como llenar el elemento primario y establecer la altura de las vistas de texto como conteo envolvente y para desplazarse tiene que haber configurado verticalmente scrool de vista de texto y como no nedded espacio de más del 50% TextView puede establecer la propiedad maxheight de vista de texto.

0

lo siento si usted encuentra este trivial. Pero estoy sugiriendo que en caso de que no te hiera. ¿Qué le parece usar el diseño relativo y mantener la vista de texto siempre en la parte superior del mapa? Haga que la gravedad de la vista textual sea superior, su ancho match_parent, su altura wrap_content y su peso 1 (igual que la del mapa). De esta forma su La vista de texto cambiará de acuerdo con el tamaño del texto, mientras que no superará el 50% debido al peso. En cuanto al mapa, el usuario puede tirar del mapa hacia abajo para ver la parte oculta debajo de la vista de texto. Será como si no hubiera un mapa debajo de la vista de texto (ya sabes, a menos que quieras que el fondo de la vista de texto sea transparente, lo que creo que se vería genial :)). No sé sobre la vista del mapa. Pero supongo que será algo así como google maps en iphone, como que puedes variar el tamaño usando multi-touch y scroll usando single.

2

La forma más fácil de hacerlo 50/50 es que XML utiliza pesos LinearLayout. Básicamente, coloque las dos vistas en un único LinearLayout establezca el android: layout_weight en ambas vistas secundarias en el mismo valor, como establecer ambas en .5, 1 o 42. A continuación, establezca el layout_width en 0px o fill_parent/match_parent.

La parte más pequeña se vuelve más complicada. Afortunadamente, puede desactivar el pesaje en Java. Una forma es esperar hasta que se dibujen las ventanas (si están previamente pobladas) y medirlas. Esto se puede hacer en Creo que se llamó en WindowsFocusChanged

Cuestiones relacionadas