Я изо всех сил стараюсь, чтобы макет выглядел правильно, и я попытался привести кратчайший, наименьший возможный пример моей проблемы.
Моя цель состоит в том, чтобы иметь верхний и нижний вид в верхней и нижней части экрана, с ListView
между ними, с другим представлением (назовем его меткой , это серая коробка от снимков экрана) прямо под ListView
. Эта метка и нижний колонтитул всегда должны отображаться, когда ListView
необходимо прокрутить.
Визуальный результат
Когда ListView
не нужно прокручивать (это правильно):
Когда необходимо прокрутить ListView
, нижний колонтитул и серый прямоугольник отодвигаются от экрана (неправильно):
Компоновка
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="header"
android:padding="20dp"
android:textSize="18sp"
android:background="@color/red"/>
<ListView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@android:id/list" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="this should be directly below the ListView, but not pushed off screen when the ListView needs to scroll"
android:padding="5dp"
android:background="@color/light_gray"
android:textColor="@color/black"/>
<!-- Used to push the footer to the bottom -->
<View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="footer"
android:padding="20dp"
android:textSize="18sp"
android:background="@color/blue"/>
</LinearLayout>
Тестовое задание
public class TestActivity extends ListActivity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ArrayList<String> items = new ArrayList<String>();
items.add("one");
items.add("two");
items.add("three");
items.add("four");
items.add("five");
items.add("six");
items.add("seven");
items.add("eight");
items.add("nine");
items.add("ten");
setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_1, items));
setContentView(com.myproject.android.R.layout.test);
}
}
Я пробовал несколько разных подходов, например, дал ListView
layout_weight="1"
и удалил пробел View
, который я использую, чтобы сдвинуть нижний колонтитул вниз. Это почти то, что я хочу, он сохраняет нижний колонтитул и метку видимыми, когда ListView
прокручивается, но когда в нем только 1 или 2 элемента, мне нужен серый прямоугольник прямо под ListView
. Я также попытался использовать RelativeLayout
, но безуспешно. Полагаю, я совершенно неправильно понимаю вещи.
EDIT
Вот моя попытка с RelativeLayout
, которая все еще не верна.
<?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:text="header"
android:padding="20dp"
android:textSize="18sp"
android:background="@color/red"
android:id="@+id/header"
/>
<ListView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@android:id/list"
android:layout_below="@id/header"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="this should be directly below the ListView, but not pushed off screen when the ListView needs to scroll"
android:padding="5dp"
android:background="@color/light_gray"
android:textColor="@color/black"
android:layout_below="@android:id/list"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="footer"
android:padding="20dp"
android:textSize="18sp"
android:background="@color/blue"
android:layout_alignParentBottom="true"
android:id="@+id/footer"/>
</RelativeLayout>
Относительное расположение (все еще неправильно):