Как создать два представления в Android, которые используют высоту 50% каждый, если только один не меньше? - PullRequest
19 голосов
/ 30 ноября 2010

Представьте себе полный экран устройства Android, я хочу, чтобы он был разделен на две части:

  1. Верхняя половина содержит текст, который может быть больше доступного (или нет) пространства и т. Д.текст будет прокручиваться (т. е. TextView внутри ScrollView)
  2. Нижняя половина содержит элемент управления MapView.

В частности, в некоторых сценариях:

  1. Еслитекст маленький, я хочу, чтобы карта занимала больше места, то есть более 50%.Так что, возможно, 20% текста, 80% карты.
  2. Если текст больше, он занимает максимум 50% пространства экрана, а затем прокручивается.Итак, карта 50%, текст 50%.

На данный момент я назначил веса двум частям, и это не так уж и плохо, но если текст маленький, карта не 'Я не могу развернуться, чтобы занять место, и макет имеет потерянный пробел, который карта могла бы с пользой использовать.

Я пробовал множество комбинаций, но не вижу, как это сделать.Мне кажется, что я знаю, чего хочу, но не понимаю, как получить доступные представления для его доставки.Я надеюсь, что есть хороший простой способ сделать это.

Пожалуйста, не стесняйтесь, чтобы я выглядел как дурак и указал на очевидный атрибут, который я пропустил: -)

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

Насколько я понимаю, нет способа сделать это только в декларативном XML, и это нужно делать в коде.Я установил для высоты текстовой секции значение wrap_content, для веса - 0 (без изменения размера), а для карты - вес = 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();
    }
}

Ответы [ 7 ]

11 голосов
/ 30 ноября 2010

Вы можете сделать это, поместив все в LinearLayout и изменив следующие параметры:

3 голосов
/ 30 ноября 2010

Вы пытались измерить высоту экрана во время выполнения:

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 голосов
/ 19 сентября 2012

Самый простой способ сделать 50/50 в XML - использовать веса LinearLayout.По сути, поместив два представления в один LinearLayout, установите для android: layout_weight для обоих дочерних представлений одно и то же значение, например, для обоих .5, 1 или 42. Затем вы задаете layout_width 0px или fill_parent / match_parent.

Меньшая часть становится более сложной.К счастью, вы можете отключить взвешивание в Java.Один из способов - дождаться рисования окон (если они предварительно заполнены) и измерить их.Это может быть сделано на Я думаю, что он был вызван onWindowFocusChanged

0 голосов
/ 12 января 2011

Извините, если вы найдете это тривиальным. Но я предлагаю это на случай, если это не ударит вас. Как насчет использования относительной компоновки и сохранения текстового обзора всегда сверху карты. Сделайте гравитацию вершины textview, ее ширину match_parent, ее высоту wrap_content и ее вес 1 (такой же, как у карты). Таким образом, ваш текстовый вид будет меняться в зависимости от размера текста, но не будет превышать 50% из-за веса. Что касается карты, пользователь может потянуть карту вниз, чтобы увидеть скрытую часть под textview. Это будет выглядеть так, как будто под textview нет карты (вы знаете, если вы не хотите сделать фон textview прозрачным, что, я думаю, будет выглядеть круто :)). Я не знаю насчет карты. Но я предполагаю, что это будет что-то вроде карты Google на iphone, например, вы можете изменять размер с помощью мультитач и прокрутки с помощью одного.

0 голосов
/ 10 января 2011

я думаю, что вам нужно установить высоту картографических изображений как родитель для заполнения и установить текстовые высоты как контекст обтекания, а для прокрутки необходимо установить значение true для scrool для текстового представления, а поскольку вы установили не более 50% свободного пространства для просмотра текста, вы можете установить свойство maxheight. textview.

0 голосов
/ 03 января 2011

ОК, так как я вижу, что что-то вроде вас резервирует на максимальной половине экрана в TextView и, если его больше, нужно прокрутить. У меня есть решение, но для этого вам придется зафиксировать максимальное число строк в 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());
    }
}

Если в тексте написано только 2 строки: "Это работает?" сместится вверх автоматически. Но единственная проблема, которую я вижу здесь, это максимальное количество строк до 5, вы можете установить максимальное значение для вас, я думаю, это может хорошо сработать:)

BR, J

P.S. Я не отвечал на многие вопросы раньше, поэтому я не уверен, как прикрепить файлы :(

0 голосов
/ 30 ноября 2010

Я не проверял это, но я бы попробовал установить для ScrollView значение android:layout_weight="1", а для MapView - android:layout_weight="0" и android:minHeight="240dp".Надеюсь, что minHeight будет иметь приоритет над layout_weight.

...