带有ListView和按钮的Android布局


101

好吧,这种特定的布局让我很烦。而且似乎找不到一种具有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);

很好的问题,很多开发人员会陷入困境。
Signcodeindie 2014年

值得庆幸的是,Android中的设计师实际上非常贴心。因此,在创建布局/ UI时,请尝试使用Designer / XML。特别是对于这种情况,因为它只是一组按钮和一个ListView。
潜入

Answers:


137

我认为这就是您想要的。

<?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>

尽管我用Java编写布局,但这基本上是我一直在使用的。listView仍然扩展到按钮上。
Kleptine

1
我唯一要更改的是我在ListView周围添加了一个relativeLayout,因为我无法在ListView上调用addRule(RelativeLayout.ABOVE)。
Kleptine

2
此代码应该可以正常工作。android:layout_above="@id/testbutton"将保持ListView以上Button
CommonsWare 2010年

当我使用此按钮时,我将列表停在按钮上方,然后开始内部滚动。
拉斯

7
你不叫addRule(RelativeLayout.ABOVE)RelativeLayout,无论是。您在上调用它RelativeLayout.LayoutParams。然后将添加ListView到中RelativeLayout,并提供RelativeLayout.LayoutParams。为了长期可维护性,请考虑切换到XML并将其夸大。
CommonsWare 2010年

57

很久以来我都遇到过同样的问题。

将ListView保留在按钮上方,但防止列表较长时掩盖它们的解决方案是在ListView上设置android:layout_weight =“ 1.0”。将按钮上的layout_weight保持未设置状态,以便它们保持其自然大小,否则按钮将被缩放。这适用于LinearLayout。

Android ApiDemos中有一个示例: ApiDemos / res / layout / linear_layout_9.xml


请再为我节省几个小时。无法理解为什么按钮从未出现。:)
frostymarvelous 2012年

我不完全理解为什么这样做,但是它起作用:)
Bevor 2012年

20

我只是在寻找这个问题的答案,这是第一个结果。我觉得所有答案(包括当前被选为“最佳答案”的答案)都没有解决所要解决的问题。所陈述的问题是两个组件存在重叠,Button并且ListViewListView占据了整个屏幕,并且Button视觉上漂浮在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作为根节点。

这是最终的工作版本,其中Button不与重叠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

我希望这有帮助。


解决了,但是谁能猜到!当您android:layout_alignParentBottomLinearLayout父级内部进行展示时,ADT会说“ LinearLayout中的无效布局参数:layout_alignParentBottom”!
阿斯温·库马尔

8

最好的方法是将布局设置在列表视图下方的相对布局。在此示例中,按钮也呈线性布局,因为更容易将它们以相等的大小并排放置。

<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>

问题是,如果列表视图过长,它将扩展到底部按钮的顶部。我不知道如何使它停在按钮上方。
Kleptine 2010年

2
如果您正在使用(我认为1.5,甚至1.6),则在使用RelativeLayout规则时必须在ListView之前具有按钮-否则,布局尚不知道Button,因为它按顺序读取它们,这就是为什么ListView扩展经过他们。
Tim H

这对我不起作用。就像Tim H所说,对我来说,我必须将ListView放在LinearLayout之后,然后进行ListView layout_above,就像上面的repoc的答案一样。
米(Nemi)2010年

这将无法正常工作,按钮不会显示在屏幕上,也不会滚动
Vaibhav Mishra

1

我知道这篇文章比较老,但是,为了回答原始发布者的问题,代码不起作用的原因是buttons.getId()返回-1。如果要执行此操作,则需要设置一些操作,例如调用button.setId(10)。如果这样做的话,代码就可以正常工作。


0

这应该工作。要在列表视图上方也有按钮,请将按钮放在另一个线性布局内。

<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>

0

最简单的解决方案是创建两个线性布局,一个带有按钮,另一个带有列表视图(在按钮高度上包装内容,在列表布局高度上匹配父级)。然后仅使用列表视图在布局上滚动视图,按钮布局将被忽略。希望对您有所帮助,对不起,我不想编写代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.