Android Layout с ListView и кнопками
Хорошо, этот конкретный макет меня просто раздражает. И не похоже, чтобы найти способ иметь listView с рядом кнопок внизу, чтобы список не распространялся поверх кнопок, поэтому кнопки всегда привязаны к нижней части экрана. Вот что я хочу:
удалена мертвая ссылка ImageShack
Кажется, это должно быть так просто, но все, что я пробовал, потерпело неудачу. Любая помощь?
Вот мой текущий код:
RelativeLayout container = new RelativeLayout(this);
container.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
//** Add LinearLayout with button(s)
LinearLayout buttons = new LinearLayout(this);
RelativeLayout.LayoutParams bottomNavParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
bottomNavParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
bottomNavParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
buttons.setLayoutParams(bottomNavParams);
ImageButton newLayer = new ImageButton(this);
newLayer.setImageResource(R.drawable.newlayer);
newLayer.setLayoutParams(new LinearLayout.LayoutParams(45, LayoutParams.FILL_PARENT));
buttons.addView(newLayer);
container.addView(buttons);
//** Add ListView
layerview = new ListView(this);
RelativeLayout.LayoutParams listParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
listParams.addRule(RelativeLayout.ABOVE, buttons.getId());
layerview.setLayoutParams(listParams);
container.addView(layerview);
Ответы
Ответ 1
Я думаю, что это то, что вы ищете.
<?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">
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/testbutton"
android:text="@string/hello" android:layout_alignParentBottom="true" />
<ListView android:layout_width="fill_parent"
android:layout_height="fill_parent" android:id="@+id/list"
android:layout_alignParentTop="true" android:layout_above="@id/testbutton" />
</RelativeLayout>
Ответ 2
У меня была такая же проблема в течение многих лет.
Решение сохранить ListView над кнопками, но не позволяя ему покрывать их, когда список длинный, заключается в установке android: layout_weight = "1.0" в ListView. Оставьте layout_weight на кнопках не установленными, чтобы они оставались в натуральном размере, иначе кнопки будут масштабироваться. Это работает с LinearLayout.
Вот пример в Android ApiDemos:
ApiDemos/res/layout/linear_layout_9.xml
Ответ 3
Я просто искал ответ на этот вопрос, и это был один из первых результатов. Я чувствую, что все ответы, в том числе тот, который в настоящее время выбран как "лучший ответ", не затрагивают вопрос, о котором идет речь. Проблема заключается в том, что существует перекрытие двух компонентов Button
и ListView
в том, что ListView занимает весь экран, а кнопка визуально плавает над (перед) ListView (блокировка просмотр/доступ к последнему элементу в ListView
)
Основываясь на ответах, которые я видел здесь и на других форумах, я наконец пришел к выводу о том, как решить эту проблему.
Изначально у меня было:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FF394952">
<ListView
android:id="@+id/game_list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
style="@android:style/ButtonBar">
<Button
android:id="@+id/new_game"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/new_game"
android:textColor="#FFFFFFFF"
android:background="@drawable/button_background" />
</LinearLayout>
</RelativeLayout>
Обратите внимание на использование RelativeLayout
в качестве корня node.
Это конечная рабочая версия, в которой кнопка не перекрывает ListView
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FF394952">
<ListView
android:id="@+id/game_list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_weight="1.0" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
style="@android:style/ButtonBar">
<Button
android:id="@+id/new_game"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/new_game"
android:textColor="#FFFFFFFF"
android:background="@drawable/button_background" />
</LinearLayout>
</LinearLayout>
Есть только две отличия. Во-первых, я переключился на использование LinearLayout
. Это поможет со следующим битом, который добавлял android:layout_weight
к моему ListView
Надеюсь, это поможет.
Ответ 4
Лучший способ - относительный макет, который устанавливает кнопки под списком. В этом примере кнопки также находятся в линейной компоновке, потому что их проще разместить рядом друг с другом в равном размере.
<RelativeLayout android:id="@+id/RelativeLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView android:id="@+id/ListView01"
android:layout_alignParentTop="true"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</ListView>
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_below="@+id/ListView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true">
<Button android:id="@+id/ButtonJoin"
android:text="Join"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_alignParentBottom="true">
</Button>
<Button android:id="@+id/ButtonJoin"
android:layout_alignRight="@id/ButtonCancel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancel"
android:layout_alignParentBottom="true">
</Button>
</LinearLayout>
</RelativeLayout>
Ответ 5
Я знаю, что этот пост довольно старый, но, чтобы ответить на исходный вопрос о посте, причина, по которой код не работал, - button.getId() возвращает -1. Если вы собираетесь это сделать, вам нужно установить что-то вроде call buttons.setId(10). Если вы это сделаете, код будет работать нормально.
Ответ 6
это должно работать. чтобы иметь кнопки над списком тоже, поместите кнопки внутри другого линейного макета.
<LinearLayout> main container // vertical
<LinearLayout> scrollview must be contained in a linear layout //vertical - height to fill parent
<ScrollView> set the height of this to fill parent
<ListView> will be contained in the scrollview
</ListView>
</ScrollView>
</LinearLayout>
<LinearLayout> //horizontal - height to wrap content
<Button>
</Button>
</LinearLayout>
</LinearLayout>
Ответ 7
самым простым решением было бы создать два линейных макета, один с кнопкой, а другой - с видом списка (оберните содержимое на высоте кнопки и сопоставьте родительский элемент на высоте макета списка). то только прокрутите представление по макету со списком, а макет кнопки будет проигнорирован. надеюсь, что это помогает, извините, я не хотел писать код.