¿Cómo crear dos vistas en Android que usan 50% de altura cada una, a menos que sea menor?

Imagine una completa pantalla de dispositivo Android, quiero dividir en dos secciones:

  1. La mitad superior tiene texto en él, que puede ser más grande 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 algunos escenarios:

  1. Si el texto es pequeño, quiero que el mapa ocupe más espacio, es decir, más del 50%. Tal vez 20% de texto, 80% de mapa.
  2. Si el texto es mayor, sólo ocupa un MÁXIMO del 50% del espacio de pantalla y, a continuación, se desplaza. Así que 50% de mapa, 50% de texto.

En el momento que he asignado pesos a las dos partes, y eso no es demasiado malo, pero si el texto es pequeño, el mapa no se expande para tomar el espacio, y el diseño tiene un espacio perdido que el mapa podría Uso útil.

He intentado un montón de combinaciones, pero no puedo ver cómo hacer que esto suceda. Parece ser una experiencia común para mí que sé 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.

Por favor, siéntase libre de hacerme parecer un tonto y señalar el atributo obvio que he perdido 🙂

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

Por lo que puedo ver no hay manera de hacer esto sólo en XML declarativo y que necesita hacer en el código. Establecer la altura de la sección de texto a wrap_content, peso a 0 (sin cambio de tamaño), y tener el mapa establecido en peso = 1 (es decir, ocupar el espacio restante). A continuación, comprobar si la sección de texto (en un ScrollView) está ocupando demasiado espacio y si es así, reducirlo. Este código necesitaría cambiar para soportar 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(); } } 

¿Ha intentado medir su altura de 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 a width * 0.5 y min_height a width * 0.2. Su vista superior tiene que ser 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 del diseño en 1.

Puede hacerlo poniendo todo en LinearLayout y cambiando los siguientes parámetros:

  • La suma de los pesos para LienarLayout
  • Pesos para niños

La forma más fácil de hacer 50/50 es en XML es usar pesos LinearLayout. Básicamente, coloque las dos vistas en un solo LinearLayout y establezca el android: layout_weight en ambas vistas secundarias con el mismo valor, como establecer ambos en .5, 1 o 42. A continuación, establezca la dirección_de_paquete 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 las ventanas se dibujen (si están pre-pobladas) y medirlas. Esto se puede hacer en Creo que fue llamado onWindowFocusChanged

No he probado esto, pero intentaría configurar tu ScrollView para tener android:layout_weight="1" y tu MapView para tener android:layout_weight="0" y un android:minHeight="240dp" . La esperanza es que minHeight tendrá precedencia sobre el layout_weight.

Creo que tienes que establecer la altura mapviews como el relleno de los padres y el conjunto de textviews altura como wrap contetn y que para el desplazamiento que tiene toset verticales scrool true para la vista de texto y como nked no más de 50% textview espacio se puede establecer maxheight propiedad de textview.

Lo siento si encuentras esto trivial. Pero lo estoy sugiriendo en caso de que no te golpee. ¿Qué tal si usamos el diseño relativo y mantenemos la vista de texto siempre encima del mapa. Haga que la gravedad de la parte superior de la vista de texto, su anchura match_parent, su altura wrap_content y su peso 1 (igual que el mapa). De esa manera su texto cambiará de acuerdo al tamaño del texto, mientras que no va por encima del 50% debido al peso. En cuanto al mapa, el usuario puede bajar el mapa para ver la parte oculta en textview. Será como si no existiera un mapa bajo la vista de texto (ya sabes, a menos que quieras que el fondo textview transparente que creo que se vería bien :)). No sé acerca de la vista del mapa. Pero estoy asumiendo que va a ser algo así como google maps en el iphone, como usted puede variar el tamaño mediante multi-touch y desplazarse con un solo.

Aceptar como veo su algo como u se están reservando en la mitad máxima de la pantalla de ur para el TextView y si es más tiene que desplazarse. Tengo una solución pero para eso tendrás que arreglar el número máximo de líneas para TextView, calculando lo que puede ser un dolor: P pero tienes una solución nunca menos.

Archivo main.xml

 <?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> 

Archivo 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?" Cambiará automáticamente. Pero el único problema que veo aquí es las líneas máximas de 5 es que puede un valor máximo para ui supongo que esto podría funcionar bien 🙂

BR, J

PS No he respondido a muchas preguntas antes de que así que no estoy seguro de cómo adjuntar archivos 🙁

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.