studio paleta objetos mover linearlayout elementos ejemplos dinamico componentes centrar boton amontonados android height screen-size

paleta - mover objetos en android studio



¿Cómo crear dos vistas en Android que usen 50% de altura cada una, a menos que una sea más pequeña? (7)

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

  1. La mitad superior tiene texto, que puede ser más grande que el espacio disponible (o no), 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%. Así que quizás el 20% del texto, el 80% del mapa.
  2. Si el texto es más grande, solo ocupa un MÁXIMO del 50% del espacio de la pantalla y luego se desplaza. Tan 50% mapa, 50% texto.

En este 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 ocupar el espacio, y el diseño tiene un espacio vacío 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 veo 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 ver como un tonto y señalar el atributo obvio que me he perdido :-)

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

Por lo que puedo ver, no hay manera de hacer esto solo en XML declarativo y se necesita hacer en el código. Establecí la altura de la sección de texto en wrap_content, peso en 0 (sin cambio de tamaño), y tengo el mapa configurado en peso = 1 (es decir, ocupa el espacio restante). Luego, verifico si la sección de texto (en un ScrollView) está ocupando demasiado espacio y, de ser así, la reduce. Este código necesitaría cambiarse 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(); } }


¿Intentaste medir la altura de tu pantalla en el tiempo de ejecución?

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

Luego, configure su vista superior max_height a ancho * 0.5 y min_height a ancho * 0.2. Su vista superior debe ser un control (como TextView) que tenga las propiedades min_height y max_height. Además, establece layout_weight en 0 o déjalo vacío. En la vista inferior, establezca el peso de diseño en 1.


Creo que tiene que establecer la altura de las vistas de mapa como padre de relleno y la altura de las vistas de texto como ajuste de la vuelta y que para el desplazamiento tiene que establecer el control vertical verdadero para la vista de texto y, como no haya insertado más del 50% del espacio, puede establecer la propiedad maxheight de la vista de texto.


De acuerdo, veo que es como si estuvieras reservando la mitad de la pantalla de tu pantalla de texto a TextView y si es más tiene que desplazarse. Tengo una solución, pero para eso tendrá que arreglar el número máximo de líneas para TextView, calculando cuál puede ser una molestia: P, pero tenga una solución sin embargo.

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 solo en 2 líneas "¿Funciona?" se moverá hacia arriba automáticamente. Pero el único problema que veo aquí es que las líneas máximas a 5 es que puede un valor máximo para ui supongo que esto podría funcionar bien :)

BR, J

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


La forma más fácil de hacer 50/50 es en XML usando pesos LinearLayout. Básicamente, coloque las dos vistas en un solo LinearLayout, establezca android: layout_weight en ambas vistas secundarias en el mismo valor, como si configurara ambas en .5, 1 o 42. Luego, configure layout_width en 0px o fill_parent / match_parent.

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


Lo siento si encuentras esto trivial. Pero lo sugiero en caso de que no te golpee. ¿Qué hay de usar el diseño relativo y mantener la vista de texto siempre encima del mapa? Haga que la gravedad de la vista de texto sea superior, su ancho match_parent, su altura wrap_content y su peso 1 (igual que el del mapa). De esa manera, su vista de texto cambiará de acuerdo con el tamaño del texto, mientras que no suba por encima del 50% debido al peso. En cuanto al mapa, el usuario puede tirar del mapa hacia abajo para ver la parte oculta en la vista de texto. Será como si no hubiera un mapa debajo de la vista de texto (ya sabes, a menos que quieras hacer 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 los mapas de Google en el iPhone, como que puede variar el tamaño con el toque múltiple y el desplazamiento con solo.


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