带有ListView和按钮的Android布局

时间:2010-03-05 00:55:06

标签: java android listview 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);

7 个答案:

答案 0 :(得分:135)

我认为这就是你要找的东西。

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

答案 1 :(得分:57)

我长期遇到同样的问题。

将ListView保持在按钮上方但阻止它在列表很长时覆盖它们的解决方案是在ListView上设置android:layout_weight =“1.0”。将layout_weight保留在​​未设置的按钮上,以使它们保持自然大小,否则按钮将缩放。这适用于LinearLayout。

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

答案 2 :(得分:20)

我只是在寻找这个问题的答案,这是最初的结果之一。我觉得好像所有的答案,包括目前被选为“最佳答案”的答案都没有解决被问到的问题。正在陈述的问题是两个组件ButtonListView的重叠,因为ListView占据整个屏幕,而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

我希望这会有所帮助。

答案 3 :(得分: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>

答案 4 :(得分:1)

我知道这篇文章相当陈旧,但是,为了回答原始海报的问题,代码不起作用的原因是buttons.getId()返回-1。如果你打算这样做,你需要设置像调用buttons.setId(10)这样的东西。如果你这样做,代码就可以了。

答案 5 :(得分: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>

答案 6 :(得分:0)

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