Я хочу показать кнопку под ListView
. Проблема в том, что если ListView
расширяется (добавляются элементы ...), кнопка выталкивается за пределы экрана.
Я пробовал использовать LinearLayout
с весами (как это было предложено в Android: почему для View нет maxHeight? ), Но либо я неправильно указал веса, либо это просто не сработало.
Кроме того, я где-то нашел подсказку использовать RelativeLayout
. ListView
Затем будет установлено над кнопкой с android:layout_above
парами.
Проблема в том, что я не знаю, как потом разместить кнопку. В найденном мною примере вид ниже ListView
был настроен с помощью android:layout_alignParentBottom
, но я не хочу, чтобы моя кнопка цеплялась за нижнюю часть экрана.
Есть идеи, кроме использования метода setHeight и некоторого расчета необходимого места?
Изменить: я получил много полезных ответов.
Решение bigstone и user639183 работало почти идеально. Однако мне пришлось добавить дополнительный отступ / маржу в нижнюю часть кнопки, так как она все равно будет вытолкнута наполовину за пределы экрана (но затем остановлена)
Ответ Адинии с относительной компоновкой подойдет только в том случае, если вы хотите, чтобы кнопка была закреплена в нижней части экрана. Это не то, что я планировал, но все же может быть полезно другим.
Решение AngeloS было тем, что я выбрал в конце, поскольку оно просто создавало желаемые эффекты. Тем не менее, я внес два небольших изменения
LinearLayout
вокруг кнопки:Во-первых, поскольку я не хотел, чтобы в моем макете были какие-либо абсолютные значения, я изменил его
android:layout_height="45px"
наwrap_content
, который тоже отлично работает.Во-вторых, поскольку я хотел, чтобы кнопка располагалась по центру по горизонтали, что поддерживается только по вертикали
LinearLayout
, я изменил android: direction = "horizontal" на "vertical".
AngeloS также заявил в своем первоначальном посте, что он не уверен, имел ли какой-либо эффект
android:layout_weight="0.1"
параметр вLinearLayout
окруженииListView
; Я просто попробовал, и это действительно так! Без этого кнопка снова выталкивается за пределы экрана.
источник
android:layout_alignParentBottom="true"
. Но для ясности: хотите ли вы, чтобы кнопка оставалась прикрепленной к нижней части ListView, когда элементов мало? Если да, посмотрите, что говорит Рич.Ответы:
У меня была именно эта проблема, и для ее решения я создал два отдельных,
LinearLayouts
чтобы разместитьListView
иButton
соответственно. Оттуда я вставил оба в другойLinear Layout
и установил этот контейнерandroid:orientation
наvertical
. Я также установить вес ,LinearLayout
что размещалсяListView
на ,0.1
но я не знаю , если это имеет какой - либо эффект. Оттуда вы можете установить высоту нижнего контейнера (с вашей кнопкой) на любую желаемую высоту.ИЗМЕНИТЬ, вот что я имею в виду:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.1" android:orientation="horizontal"> <ListView android:id="@+id/ListView01" android:layout_width="fill_parent" android:layout_height="fill_parent" android:dividerHeight="2px"></ListView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="45px" android:background="@drawable/drawable" android:orientation="horizontal"> <Button android:id="@+id/moreButton" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:background="@drawable/btn_more2" android:paddingRight="20px" /> </LinearLayout>
Вышеупомянутое решение зафиксирует кнопку в нижней части экрана.
Чтобы кнопка находилась внизу списка, измените высоту
ListView01
наwrap_content
:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.1" android:orientation="horizontal"> <ListView android:id="@+id/ListView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:dividerHeight="2px"></ListView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="45px" android:background="@drawable/drawable" android:orientation="horizontal"> <Button android:id="@+id/moreButton" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:background="@drawable/btn_more2" android:paddingRight="20px" /> </LinearLayout>
источник
<div
теги в HTML ... это просто оболочка, и это решение определенно работает.Я решил эту проблему в коде, установив высоту списка только в том случае, если в нем более 5 элементов:
if(adapter.getCount() > 5){ View item = adapter.getView(0, null, listView); item.measure(0, 0); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, (int) (5.5 * item.getMeasuredHeight())); listView.setLayoutParams(params); }
Обратите внимание, что я установил максимальную высоту в 5,5 раза больше высоты одного элемента, поэтому пользователь будет точно знать, что нужно сделать прокрутку! :)
источник
При последнем редактировании вам просто нужно также добавить
android:layout_above="@+id/butt1"
свой код ListView.И чтобы показать вам (и всем, кто пробовал ответить ранее), что вам действительно не нужно использовать более одного
RelativeLayout
, вот ваш исправленный код :<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/bkg"> <TextView android:id="@+id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TextView1" android:layout_alignParentTop="true"> </TextView> <TextView android:id="@+id/textView2" android:layout_below="@+id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TextView2" android:layout_centerHorizontal="true"> </TextView> <Button android:id="@+id/butt1" android:text="string/string3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true"> </Button> <ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="2dip" android:layout_marginBottom="2dip" android:drawSelectorOnTop="false" android:visibility="visible" android:layout_below="@+id/textView2" android:layout_above="@+id/butt1" /> </RelativeLayout>
и результат , используя некоторый случайный список:
источник
Используя
LinearLayout
, установите высоту вашегоListView
иButton
доwrap_content
и добавьте вес = 1 кListView
. Это должно работать так, как вы хотите.И да, установите
layout_gravity
изButton
вbottom
источник
Нашел способ сделать это без использования вложенных контейнеров, вдохновленный решением AngeloS.
Я использовал
LinearLayout
вертикальную ориентацию, в которой естьListView
кнопки и. Я установилandroid:layout_weight="0.1"
дляListView
.Ему удается всегда удерживать кнопку внизу списка. И кнопка не убирается с экрана при увеличении списка.
<ListView android:id="@+id/notes_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.1" /> <Button android:id="@+id/create_note_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onCreateButtonClicked" android:text="@string/create_notes" />
источник
android:layout_height="wrap_content"
для LinearLayout, как и в вашем решении, он работает отлично, и не только на 4.4.3, но, поскольку Sparkle не упоминал об этом, я пробовал этоmatch_parent
раньше.RelativeLayout
является решением, если вы не хотите, чтобы кнопка оставалась слишком близко к низу, вы можете добавить поля (добавление кнопки сломало бы ее, потому что она использует фон из 9 патчей и устанавливает собственное заполнение).Было бы то же самое, если бы вы использовали
LinearLayout
: способ добиться того, что вы хотите, - установитьListView
для параметра height = 0 и weight = 1, а для кнопки height = wrap_content и weight = 0.(установка обоих на wrap_content, как сказал user639183, не ограничиваетListView
высоту).источник
ListView
высотуВероятно, вы можете сделать эту работу, используя вложенные контейнеры. Возможно, вам понадобится обернуть Button во второй (внутренний) контейнер, чтобы он занимал больше места, и просто выровняйте Button по верхней части внутреннего контейнера.
Возможно что-то вроде этого:
RelativeLayout
-- Посмотреть список
- RelativeLayout
---- Кнопка
Используя различные варианты выравнивания двух контейнеров, вы сможете заставить это работать.
источник
android:layout_marginTop="30dip"
кнопки, например, если вам нужно больше места между списком и кнопкой.Это самый чистый способ сделать это:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ListView android:id="@+id/ListView01" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:dividerHeight="2px"> </ListView> <FrameLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/drawable" > <Button android:background="@drawable/btn_more2" android:id="@+id/moreButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:paddingRight="20px" /> </LinearLayout> </LinearLayout>
Это похоже на решение Angelos, но вам не нужен linearlayout, который завершает ListView. Также вы можете использовать FrameLayout, который легче по сравнению с LinearLayout, чтобы обернуть кнопку.
источник
Идея воплощена в очень хороших решениях:
Кажется, что они оба отлично работают, по крайней мере, на v4.4.3.
Мне все еще пришлось потратить некоторое время на написание тестового кода, чтобы проверить его и подтвердить каждый метод. Ниже приведен автономный минимальный тестовый код.
Макет основан на решении Sparkle, так как он содержит меньше вложенных макетов. Также был обновлен, чтобы отразить текущие проверки LINT.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" tools:context="MainActivity" > <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" /> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Grow List" tools:ignore="HardcodedText" /> </LinearLayout>
Activity предоставляет шаблонный код для самостоятельной проверки решения.
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ListView listview = (ListView)findViewById(R.id.listview); final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>()); adapter.setNotifyOnChange(true); listview.setAdapter(adapter); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int count = adapter.getCount(); adapter.add(String.valueOf(count)); listview.setSelection(count); } }); } }
Не стесняйтесь добавлять или улучшать, так как это «вики сообщества».
источник
Попробуйте использовать RelativeLayout с кнопкой внизу. Установите высоту макета как «wrap_content». Я не пробовал. Просто идея
источник
в LinearLayout просто добавьте
android:layout_weight="1"
к вам ListViewисточник
Вот что сработало для меня ...
if(adapter.getCount() > 3){ View item = adapter.getView(0, null, impDateListView); item.measure(0, 0); LayoutParams params = impDateListView.getLayoutParams(); params.width = LayoutParams.MATCH_PARENT; params.height = 3 * item.getMeasuredHeight(); impDateListView.setLayoutParams(params); }
Примечание: params.width = ... Необходимо также установить ...
В приведенном выше примере вы используете TableRow и ListView внутри TableRow ...
источник
обернуть контент в линейный макет
в представлении списка добавить: android: layout_weight = "1"
в вашей кнопке установите фиксированную высоту
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ListView android:id="@+id/my_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1"> </ListView> <Button android:text="Button" android:layout_width="match_parent" android:layout_height="50dp"/> </LinearLayout>
источник
Если вы хотите, чтобы содержимое под списком перемещалось вниз по мере добавления элементов в список, попробуйте следующее решение:
Добавьте положительное заполнение в нижнюю часть списка и негативное в верхнюю часть «нижнего колонтитула». Это будет работать в линейном или относительном макете.
<ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="50dp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="-50dp"/>
источник
Поскольку атрибута MaxHeight нет, лучше всего либо установить для высоты ListView заданное значение, либо использовать
wrap_content
.источник
Я решил это, поместив ListView в ScrollView. Линту это не понравилось, но, добавив minHeight и установив для fillViewport значение true, я получил хороший результат.
<ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="1dp" android:layout_marginRight="1dp" android:minHeight="100dp" android:fillViewport="true" android:fadeScrollbars="false" android:paddingTop="2dp" android:orientation="vertical" android:scrollbarAlwaysDrawVerticalTrack="true" > <ListView android:id="@+id/workoutAElistRoutines" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="fill_vertical" android:background="@drawable/dialog_inner_border_tan" android:choiceMode="singleChoice" android:orientation="vertical" android:paddingLeft="3dp" android:paddingRight="3dp" > </ListView> </ScrollView>
источник