Как создать два представления в Android, которые используют 50% высоты каждый, если только он меньше?
Представьте себе полный экран устройства 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();
}
}
Ответы
Ответ 1
Вы пытались измерить высоту экрана во время выполнения:
Display display = ((WindowManager)
getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getHeight();
Затем установите верхний вид max_height в ширину * 0,5 и min_height в ширину * 0,2. Ваш верхний вид должен быть контролем (например, TextView), который имеет свойства min_height и max_height. Кроме того, установите layout_weight равным 0 или оставьте его пустым.
На вашем представлении снизу установите вес макета на 1.
Ответ 2
Вы можете сделать это, поместив все в LinearLayout и изменив следующие параметры:
Ответ 3
Самый простой способ сделать 50/50 в XML - это использование весов LinearLayout. В принципе, эти два представления в один LinearLayout устанавливают android: layout_weight на обоих дочерних представлениях на одно и то же значение, например, для установки как .5, 1 или 42. Затем вы устанавливаете layout_width равным 0px или fill_parent/match_parent.
Меньшая часть становится более сложной. К счастью, вы можете отключить взвешивание на Java. Один из способов - подождать, пока окна не будут нарисованы (если они предварительно заполнены) и измерить их. Это можно сделать, я думаю, что он был вызван onWindowFocusChanged
Ответ 4
Я не тестировал это, но попробую настроить свой ScrollView на android:layout_weight="1"
и MapView
на android:layout_weight="0"
и android:minHeight="240dp"
. Надеемся, что minHeight будет иметь приоритет над layout_weight.
Ответ 5
ОК, поскольку я вижу, что что-то вроде u резервирует на максимальной половине экрана ur в TextView, и если его больше нужно прокручивать. У меня есть решение, но для этого вам нужно будет исправить max no.l строк для TextView, вычисляя, что может быть болью: P, но имеет решение, тем не менее.
файл 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>
Файл 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());
}
}
Если текст говорит только в двух строках: "Это работает?" будет автоматически перемещаться. Но единственная проблема, которую я вижу здесь, - это максимальные линии до 5, вы можете получить максимальное значение для u, я думаю, это может сработать:)
BR,
J
P.S. Я не ответил много вопросов, прежде чем я не уверен, как прикреплять файлы:(
Ответ 6
Я думаю, что вам нужно установить высоту mapviews как заполнить родительский элемент и установить высоту textviews в качестве параметра wrap contnn, а для прокрутки вы установите вертикальный scrool true для текстового вида, и поскольку вы указали не более 50% текста пространства, вы можете установить свойство maxheight текста.
Ответ 7
Прошу прощения, если вы найдете это тривиальным.
Но я предлагаю это на случай, если это вас не поразит.
Как насчет использования относительной компоновки и сохранения текста всегда поверх карты.
Сделайте гравитацию верхней части текста, ее ширину match_parent, ее высоту wrap_content и ее вес 1 (то же, что и карта thee). Таким образом, ваше текстовое изображение изменится в соответствии с размером текста, но не будет превышать 50% из-за веса. Что касается карты, пользователь может вытащить карту вниз, чтобы увидеть скрытую часть в текстовом режиме. Будет выглядеть так, как будто в текстовом виде нет карты (вы знаете, если вы не хотите, чтобы прозрачный текст был прозрачным, который, я думаю, выглядел бы круто:)). Я не знаю о карте. Но я предполагаю, что это будет что-то вроде карт google на iphone, например, вы можете изменять размер с помощью multi-touch и прокручивать, используя одиночный.