Как создать два представления в Android, которые используют 50% высоты каждый, если только он меньше?

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

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

Глядя конкретно на некоторые сценарии:

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

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

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

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

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

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

Solutions Collecting From Web of "Как создать два представления в Android, которые используют 50% высоты каждый, если только он меньше?"

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

 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.

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

  • Сумма весов для LienarLayout
  • Весовые коэффициенты для детей

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

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

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

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

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

OK, поскольку я вижу, что что-то вроде 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, вы можете использовать максимальное значение для ui, это может сработать хорошо 🙂

BR, J

PS Я не ответил на многие вопросы, прежде чем я не уверен, как прикреплять файлы 🙁