ListView 및 버튼이있는 Android 레이아웃


101

좋아,이 특정 레이아웃은 나를 짜증나게한다. 그리고 목록보기가 버튼의 상단 위로 확장되지 않도록 하단에 버튼 행이있는 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이기 때문입니다.
Subby

답변:


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

1
내가 변경하는 유일한 것은 ListView에서 addRule (RelativeLayout.ABOVE)를 호출 할 수 없기 때문에 ListView 주위에 relativeLayout을 추가한다는 것입니다.
Kleptine 2010 년

2
이 코드는 잘 작동합니다. android:layout_above="@id/testbutton"을 유지할 ListViewButton.
CommonsWare 2010 년

이것을 사용하면 목록이 버튼 위에서 멈추고 내부적으로 스크롤을 시작합니다.
lars

7
당신은 호출하지 않는 addRule(RelativeLayout.ABOVE)A의 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

나는 이것이 왜 작동하는지 완전히 이해하지 못하지만 작동합니다 :)
Bevor

20

이 질문에 대한 답을 찾고 있었는데 이것이 첫 번째 결과 중 하나였습니다. 현재 "우수 답변"으로 선정 된 답변을 포함하여 모든 답변이 질문 된 문제를 해결하지 못하는 것 같습니다. 언급되는 문제가있다 두 성분의 중첩 있다는 ButtonListViewListView에 화면 전체를 차지 것을, 그리고 버튼을 시각적으로 (/ 최후의 찾아보기를 차단의 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루트 노드로 의 사용에 유의하십시오 .

이것은 버튼이 다음 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_weightListView

이게 도움이 되길 바란다.


이것은 해결되지만 누가 추측할까요!? 부모 android:layout_alignParentBottom안에 줄 때 LinearLayoutADT는 "LinearLayout의 잘못된 레이아웃 매개 변수 : layout_alignParentBottom"이라고 말합니다!
Aswin Kumar

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 전에 버튼이 있어야합니다. 그렇지 않으면 레이아웃이 버튼을 순서대로 읽기 때문에 아직 버튼을 인식하지 못하므로 ListView가 확장됩니다. 과거.
Tim H

이것은 나를 위해 작동하지 않습니다. Tim H가 말했듯이, 저는 LinearLayout 뒤에 ListView를 놓고 위의 repoc의 대답처럼 ListView layout_above를 만들어야합니다.
Nemi

이하지 않습니다 작품은, 버튼이 화면에하지, 스크롤하지 않습니다
하기 Vaibhav 슈라

1

이 게시물이 다소 오래되었다는 것을 알고 있지만 원래 포스터의 질문에 답하기 위해 코드가 작동하지 않은 이유는 buttons.getId ()가 -1을 반환했기 때문입니다. 이렇게하려면 call buttons.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

가장 쉬운 해결책은 두 개의 선형 레이아웃을 만드는 것입니다. 하나는 버튼이 있고 다른 하나는 목록보기 (버튼 높이에 콘텐츠를 래핑하고 목록 레이아웃 높이에 부모와 일치)가 있습니다. 그런 다음 목록보기가있는 레이아웃 위에 스크롤보기 만 만들면 버튼 레이아웃이 무시됩니다. 도움이되기를 바랍니다. 코드를 작성하고 싶지 않아서 죄송합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.