我正在努力让布局看起来正确,而且我试图生成我问题的最短,最小的例子。
我的目标是在屏幕顶部和底部有一个页眉和页脚视图,两者之间有一个ListView
,另一个视图(让我们称之为标签,它是屏幕截图中的灰色框)直接位于ListView
下方。 <{1}}需要滚动时,应始终显示此标签和页脚。
当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
滚动时保持页脚和标签可见,但是当它只有1或2个项目时,我需要ListView
正下方的灰色框。我还试图使用ListView
,但没有成功。我想我完全误解了事情。
这是我使用RelativeLayout
的尝试仍然不正确。
RelativeLayout
答案 0 :(得分:9)
将android:layout_weight="1"
添加到列表视图中。这将使它成为LinearLayout中最大的元素,而不会将其他元素从屏幕上移开。
答案 1 :(得分:7)
此布局将标题添加到屏幕的顶部以及脚注和底部。该列表填充了屏幕的其余部分。随着这些aproach列表元素永远不会被页脚遮挡。了解如何在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:text="header"
android:padding="20dp"
android:textSize="18sp"
android:background="@color/red"
android:id="@+id/header"
/>
<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"/>
<ListView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@android:id/list"
android:layout_below="@id/header"
android:layout_above="@id/footer"/>
</RelativeLayout>
确定。此XML解决了页脚丢失的问题。现在我们必须在列表的末尾添加一个灰色框。我认为有两种方法可以做到:
使用addFooterView方法:http://developer.android.com/reference/android/widget/ListView.html#addFooterView(android.view.View)
使用适配器和getViewTypeCount()方法进行游戏,以便定义两种类型或元素:普通元素和页脚元素。 http://developer.android.com/reference/android/widget/BaseAdapter.html#getViewTypeCount()
答案 2 :(得分:1)
回答这个问题的时间晚了两年,但我会留下我的解决方案,这样可以帮助有同样问题的人。我使用2个嵌套的LinearLayouts并使用layout_weigth解决了这个问题。也许不是最佳的性能布局,但它达到了预期的效果。
您需要以这种方式安排布局:
现在你有一个带有列表和灰色视图的布局,如果它太大,列表不会将其他视图推出屏幕;您只需将页脚视图移动到屏幕底部即可。
5a上。如果您使用RelativeLayout作为根布局,您可以像sgallego所说的那样使用android:layout_alignParentBottom。
5b中。但是如果您使用的是LinearLayout,则需要使用layout_weigth创建第三个布局并将其放入第4步的布局中,并使用layout_weigth创建一个空视图以填充空白区域。
这是一个注释的例子。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- Header -->
<TextView
android:id="@+id/RecordStudy_StudyLabel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/RecordStudy_StudyLabel"
android:textSize="@dimen/text_large" />
<!-- Body -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical" >
<!--
This layout encapsules the list and the button that must be immediately
below the list with a wrap_content height, so the list plus the button
fills only as much space as they need (if the list is not big enouth to
fill the entire screen).
-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<!--
Layout with varaible size with a list inside.
Using layout_weight tells android that this layout should not grow
greater then the screen, but uses only the free space.
-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical" >
<!--
Inside this limited height layout, there is a list with height
wrap_content so it can grow as much as it needs INSIDE the
layout (through scrolling).
-->
<ListView
android:id="@+id/RecordStudy_StudyList"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<!-- Button immediately below the list -->
<Button
android:id="@+id/RecordStudy_AddStudy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/RecordStudy_AddStudy" />
</LinearLayout>
<!-- Space between the list and the footer -->
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
<!-- Footer -->
<Button
android:id="@+id/RecordStudy_ConfirmButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/RecordStudy_ConfirmButton" />
</LinearLayout>
答案 3 :(得分:0)
我实现并发现有用的一个解决方案是将listview保持在具有固定高度的线性布局中,以便它不会扩展并与其他项重叠。
这样的事情:
<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"
/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="150dip" //assume 150dip height is sufficient
<ListView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@android:id/list"
android:layout_below="@id/header"/>
</LinearLayout>
<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"/>
答案 4 :(得分:0)
对我有用的解决方案是在列表视图的底部添加正填充,并在&#34;页脚&#34;的顶部添加负填充。这将在线性布局或相对布局中工作。
<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"/>