Подтвердить что ты не робот

Как создать два представления в 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();
    }
}
4b9b3361

Ответ 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.

Ответ 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 и прокручивать, используя одиночный.