Представьте себе полный экран устройства Android, я хочу, чтобы он разделился на два раздела:
- Верхняя половина имеет в ней текст, который может быть больше доступного пространства (или нет), и поэтому текст будет прокручиваться (т.е. TextView внутри ScrollView)
- Нижняя половина содержит элемент управления MapView.
Посмотрев конкретно на некоторые сценарии:
- Если текст невелик, я хочу, чтобы карта занимала больше места, то есть более 50%. Таким образом, возможно, 20% текста, 80% -ная карта.
- Если текст больше, он занимает только МАКСИМАЛЬНО 50% экрана, а затем прокручивается. Таким образом, 50% -ная карта, 50% -ный текст.
В настоящий момент я назначил веса двум частям, и это не так уж плохо, но если текст невелик, карта не расширяется, чтобы занять пробел, а макет имеет пропавший пробел, который карта может с пользой использовать.
Я пробовал множество комбинаций, но не могу понять, как это сделать. Мне кажется, что я знаю, что хочу, но не могу понять, как получить доступные представления для его доставки. Я надеюсь, что там будет хороший простой способ сделать это.
Пожалуйста, не стесняйтесь, чтобы я выглядел как дурак и указывал на очевидный атрибут, который я пропустил: -)
=============================================== =======================
Насколько я вижу, нет никакого способа сделать это только в декларативном XML, и это нужно делать в коде. Я установил высоту текстового раздела в wrap_content, weight to 0 (без изменения размера) и установил карту в weight = 1 (т.е. Занял оставшееся пространство). Затем я проверяю, занимает ли текстовый раздел (в ScrollView) слишком много места, и если да, уменьшите его. Этот код потребуется изменить для поддержки другой ориентации макета.
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();
}
}