Como criar duas visualizações no Android que usam 50% de altura cada, a menos que uma seja menor?
Imagine uma tela de dispositivo Android completa, quero dividi-la em duas seções:
A metade superior possui texto, que pode ser maior que o espaço disponível (ou não) e, portanto, o texto será rolado (ou seja, TextView dentro de um ScrollView)A metade inferior contém um controle MapView.Analisando especificamente alguns cenários:
Se o texto for pequeno, quero que o mapa ocupe mais espaço, ou seja, mais de 50%. Então, talvez 20% do texto, 80% do mapa.Se o texto for maior, ele ocupa apenas um MÁXIMO de 50% do espaço da tela e depois rola. Então, mapa de 50%, texto de 50%.No momento, atribui pesos às duas partes, e isso não é ruim, mas se o texto for pequeno, o mapa não se expandirá para ocupar espaço e o layout terá uma lacuna desperdiçada que o mapa poderia utilmente usar.
Eu tentei muitas combinações, mas não consigo ver como fazer isso acontecer. Parece ser uma experiência comum para mim que eu sei o que quero, mas não consigo ver como obter as visualizações disponíveis para fornecê-lo. Espero que haja uma maneira fácil e agradável de fazer isso.
Por favor, sinta-se livre para me fazer parecer um tolo e apontar o atributo óbvio que eu perdi :-)
==================================================== ====================
Tanto quanto eu posso ver, não há como fazer isso apenas em XML declarativo e isso precisa ser feito no código. Defino a altura da seção de texto como wrap_content, peso como 0 (sem redimensionamento) e tenho o mapa definido como peso = 1 (ou seja, ocupe o espaço restante). Depois, verifico se a seção de texto (em um ScrollView) está ocupando muito espaço e, se houver, reduzi-a novamente. Esse código precisaria ser alterado para oferecer suporte a uma orientação de layout 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();
}
}