화면 하단에서보기를 어떻게 정렬합니까?


635

내 레이아웃 코드는 다음과 같습니다.

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

    <TextView android:text="@string/welcome"
        android:id="@+id/TextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </TextView>

    <LinearLayout android:id="@+id/LinearLayout"
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="bottom">

            <EditText android:id="@+id/EditText"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content">
            </EditText>

            <Button android:text="@string/label_submit_button"
                android:id="@+id/Button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
            </Button>

    </LinearLayout>

</LinearLayout>

이 모양은 왼쪽에 있고 내가 원하는 모양은 오른쪽에 있습니다.

Android 레이아웃-실제 (왼쪽) 및 원하는 (오른쪽)

확실한 대답은 TextView를 높이에 fill_parent로 설정하는 것이지만 버튼이나 입력 필드를위한 공간이 남아 있지 않습니다.

본질적으로 문제는 제출 버튼과 텍스트 항목이 하단의 고정 높이가되고 텍스트보기가 나머지 공간을 채우길 원한다는 것입니다. 마찬가지로 수평 선형 레이아웃에서 제출 버튼이 내용을 감싸고 텍스트 항목이 나머지 공간을 채우도록하고 싶습니다.

선형 레이아웃의 첫 번째 항목에 fill_parent가 지시되면 정확히 그렇게하므로 다른 항목을위한 공간이 없습니다. 레이아웃의 나머지 항목에 필요한 최소 공간을 제외한 모든 공간을 채우기 위해 선형 레이아웃에서 첫 번째 항목을 얻는 방법은 무엇입니까?


상대 레이아웃은 실제로 대답했습니다.

    <?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:text="@string/welcome"
        android:id="@+id/TextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true">
    </TextView>

    <RelativeLayout
        android:id="@+id/InnerRelativeLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >

        <Button
            android:text="@string/label_submit_button"
            android:id="@+id/Button"
            android:layout_alignParentRight="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </Button>

        <EditText
            android:id="@+id/EditText"
            android:layout_width="fill_parent"
            android:layout_toLeftOf="@id/Button"
            android:layout_height="wrap_content">
        </EditText>

    </RelativeLayout>

</RelativeLayout>

7
@oneself Paint;) 나는 Tea Vui Huang teavuihuang.com/android의
gav

14
이를 해결 한 레이아웃 XML을 게시 한 경우 +1입니다. 내 문제가 무엇인지 파악하는 데 도움이되었습니다.
Howler

답변:


526

이 작업을 수행하는 현대적인 방법은 ConstraintLayout 을 사용하여 뷰의 하단을 ConstraintLayout의 하단으로 제한하는 것입니다.app:layout_constraintBottom_toBottomOf="parent"

아래 예제는 화면의 끝과 아래쪽에 정렬되는 FloatingActionButton을 만듭니다.

<android.support.constraint.ConstraintLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_height="match_parent"
   android:layout_width="match_parent">

<android.support.design.widget.FloatingActionButton
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"

    app:layout_constraintBottom_toBottomOf="parent"

    app:layout_constraintEnd_toEndOf="parent" />

</android.support.constraint.ConstraintLayout>

참고로 이전 답변을 유지하겠습니다.

ConstraintLayout을 도입하기 전에는 상대적 레이아웃 이었습니다.


전체 화면을 채우는 상대 레이아웃이있는 경우 android:layout_alignParentBottom버튼을 화면 맨 아래로 이동하는 데 사용할 수 있어야합니다 .

맨 아래의 뷰가 상대 레이아웃으로 표시되지 않으면 위의 레이아웃이 모든 공간을 차지할 수 있습니다. 이 경우 먼저 레이아웃 파일에서 맨 아래에있는 뷰를 배치하고을 사용하여 뷰 위에 나머지 레이아웃을 배치 할 수 있습니다 android:layout_above. 이렇게하면 하단 뷰가 필요한만큼의 공간을 차지할 수 있으며 나머지 레이아웃은 나머지 모든 화면을 채울 수 있습니다.


5
참고 : ScrollView에서는 작동하지 않습니다. 이것이 내가 지금 직면하고있는 문제입니다. 참조 stackoverflow.com/questions/3126347/...
IgorGanapolsky

6
맞습니다. ScrollView와 Relative Layouts는 잘 섞이지 않습니다. 한 페이지에 모든 것을 표시하기 위해 많은 콘텐츠가 필요한 경우 linearlayout을 사용하고 맨 아래보기를 마지막에 넣으십시오. 작은 화면에서는 스크롤보기에서 마지막으로, 큰 휴대폰에서는 페이지 하단에보기를 표시하려면 다른 레이아웃 파일을 사용하고 리소스 한정자를 사용하여 장치가 올바른 레이아웃 파일을 선택할 수있게하십시오.
Janusz

좋아요 .. 여기서 두 번째 단락의 요점은 무엇입니까? "먼저 화면 하단을 덮는 레이아웃을 찾아야합니까?" 그런 다음 레이아웃 내부에 layout_alignParentBottom을 사용해야합니까? 우리에게 무엇이 필요 android:layout_above합니까?
eugene

하단의 막대와 같은 것을 원하고이 막대 위의 LinearLayout을 화면 상단에서 막대로 확장하려면 위가 필요합니다.
Janusz

1
"Android Weekly"중 하나를 읽은 that RelativeLayout것은 메모리를 소비하므로 가능할 때마다 피해야합니다.
Tomasz Mularczyk 2016 년

153

A의 ScrollView(가)로이 아니라 작업을 수행 RelativeLayout하고자 다음 오버랩에 어떤 ScrollView페이지 하단에.

동적으로 스트레칭을 사용하여 수정했습니다 FrameLayout.

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent" 
    android:layout_width="match_parent"
    android:fillViewport="true">
    <LinearLayout 
        android:id="@+id/LinearLayout01"
        android:layout_width="match_parent" 
        android:layout_height="match_parent"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical">

                <!-- content goes here -->

                <!-- stretching frame layout, using layout_weight -->
        <FrameLayout
            android:layout_width="match_parent" 
            android:layout_height="0dp"
            android:layout_weight="1">
        </FrameLayout>

                <!-- content fixated to the bottom of the screen -->
        <LinearLayout 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content"
            android:orientation="horizontal">
                                   <!-- your bottom content -->
        </LinearLayout>
    </LinearLayout>
</ScrollView>

1
이것은 훌륭합니다. 또한 "최소 침습적"이며 RelativeLayout 접근 방식보다 직관적입니다. 할 수 있다면 둘 이상의 공감대를 줄 것입니다!
manmal

4
내 응용 프로그램에서 솔루션을 사용하지만 제 경우에는 키보드가 나타날 때 버튼이 화면 하단 (키보드 뒤에)에 남아 있기를 원합니다. 탁
Yoann

1
@DoubleYo : 매니페스트 android : windowSoftInputMode = "adjustPan"
Kopfgeldjaeger

2
바닥이 영구적으로 고정되도록하려는 경우 항상 작동하지 않습니다. 그렇지 않으면 작동합니다.
K-SO의 독성이 증가하고 있습니다.

72

선형 레이아웃 내에 상대 레이아웃을 중첩하여 초기 선형 레이아웃을 유지할 수 있습니다.

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView android:text="welcome" 
        android:id="@+id/TextView" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content">
    </TextView>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button android:text="submit" 
            android:id="@+id/Button" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true">
        </Button>
        <EditText android:id="@+id/EditText" 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/Button"
            android:layout_alignParentBottom="true">
        </EditText>
    </RelativeLayout>
</LinearLayout>

2
이것은 모듈식이 아니기 때문에 지저분한 접근 방식입니다. 레이아웃이 겹치지 않아야합니다. 이 디자인은 RelativeLayout의 배경을 변경하거나 뷰를 더 크게 만들거나 뷰를 추가하려는 즉시 작동하지 않습니다.
Patrick

42

위의 대답 (Janusz)은 꽤 정확하지만 개인적으로 RelativeLayouts와 100 % 불편 함을 느끼지 않으므로 다음과 같이 빈 TextView 'filler'를 선호합니다.

<!-- filler -->
<TextView android:layout_height="0dip" 
          android:layout_width="fill_parent"
          android:layout_weight="1" />

화면 하단에있는 요소 앞에


이것이 x 또는 y 축으로 확장됩니까? 높이에 0 딥을 주면 높이없이 텍스트 뷰를 만들 수 있습니까? 또는 x 축만큼 확장 할 수 있습니까?
Lukap

높이 (세로 축)가 0으로 설정되고 가중치가 1로 설정되기 때문에 수직으로 확장됩니다 (다른 요소의 가중치가 0이라고 가정).
Timores

x 축에서, 그것은 부모 (fill_parent)가 될 것입니다
Timores

텍스트 뷰 대신 다른 선형 레이아웃을 사용합니다. 레이아웃보기는 공간을 채우는 데 사용할 수 있음을 의미하는 것 같습니다.
ComeIn

33

LinearLayout 또는 ScrollView를 사용 하여이 작업을 수행 할 수도 있습니다. 때로는 RelativeLayout보다 구현하기가 더 쉽습니다. 화면 하단에 정렬하려는 뷰 앞에 다음 뷰를 추가해야합니다 .

<View
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

빈 공간을 채우고 다음 뷰를 화면 맨 아래로 밀어서 빈 뷰를 만듭니다.


27

이것은 또한 작동합니다.

<LinearLayout 
    android:id="@+id/linearLayout4"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_below="@+id/linearLayout3"
    android:layout_centerHorizontal="true"
    android:orientation="horizontal" 
    android:gravity="bottom"
    android:layout_alignParentBottom="true"
    android:layout_marginTop="20dp"
>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" 

    />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" 


    />

</LinearLayout>

LinearLayout 요소를 맨 아래로 플로팅하는 중력 = "bottom"


12
android : layout_alignParentBottom = "true"는 LinearLayout이 RelativeLayout 안에 중첩되어 있지 않으면 아무런 영향을 미치지 않습니다.
Thomas Dignan

설명은 순서대로 이루어집니다 (예 : 필수 변경, 작동 방식, 작동 이유 등).
Peter Mortensen

26

1. ConstraintLayout루트 레이아웃에서 사용

그리고 app:layout_constraintBottom_toBottomOf="parent"화면 하단에 레이아웃이 있도록 설정 하십시오.

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintBottom_toBottomOf="parent">
</LinearLayout>

2. FrameLayout루트 레이아웃에서 사용

android:layout_gravity="bottom"레이아웃에서 설정 하십시오.

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:orientation="horizontal">
</LinearLayout>

3. LinearLayout루트 레이아웃에서 사용 ( android:orientation="vertical")

(1) 레이아웃 android:layout_weight="1"상단에 레이아웃 을 설정하십시오.

<TextView
    android:id="@+id/TextView"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:text="welcome" />

(2) 자녀 LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"

주요 속성은 ndroid:gravity="bottom"입니다.

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="bottom"
    android:orientation="horizontal">
</LinearLayout>

RelativeLayout루트 레이아웃에서 사용

그리고 설정 android:layout_alignParentBottom="true"화면의 하단에있는 레이아웃을 수 있도록

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal">
</LinearLayout>

산출

여기에 이미지 설명을 입력하십시오


20

Timores의 우아한 솔루션 에 이어 다음은 세로 LinearLayout에 세로 채우기를, 가로 LinearLayout에 가로 채우기를 만드는 것으로 나타났습니다.

<Space
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1" />

@sepehr 내 솔루션이 작동하지 않는 것을 발견 한 경우 다른 요소가 있어야합니다. 방금 조각 레이아웃으로 솔루션을 시도했지만 거기에서도 작동합니다.
stevehs17

가중치는 선형 레이아웃에서 지원되며 @sepehr은 조각, 활동, 알림, 대화 상자에서도 작동합니다.)
Jan Rabe

16

relative첫 번째 레이아웃 안에 두 번째 레이아웃 을 중첩시킬 필요조차 없습니다 . 버튼EditText를 사용하면 android:layout_alignParentBottom="true"됩니다 .


이것은 Button 및 EditText와 함께 작동하지만 TableLayout 을이 방법으로 정렬하려고하면 작동하지 않습니다. 다른 RelativeLayout 안에 중첩시켜야합니다.

11

많은 변경을 원하지 않으면 다음을 입력하십시오.

android:layout_weight="1"

@+id/TextView즉 ID가 ID 인 TextView의 경우

<TextView android:text="@string/welcome" 
    android:id="@+id/TextView" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:layout_weight="1">
</TextView>

또는 android : layout_weight = "1"을 사용하여 주변 LinearLayout을 추가하십시오-이것은 ScrollView 내에서도 잘 작동합니다!
bk138

7

headerfooter를 모두 만드는 예제는 다음과 같습니다.

레이아웃 XML

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/backgroundcolor"
    tools:context=".MainActivity">

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:background="#FF0000">
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:layout_alignParentBottom="true"
        android:background="#FFFF00">
    </RelativeLayout>

</RelativeLayout>

스크린 샷

여기에 이미지 설명을 입력하십시오


4

아래 코드를 사용하십시오. 버튼을 엉덩이에 맞 춥니 다. 작동합니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn_back"
        android:layout_width="100dp"
        android:layout_height="80dp"
        android:text="Back" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.97"
        android:gravity="center"
        android:text="Payment Page" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Submit"/>
    </LinearLayout>

</LinearLayout>

3

이런 경우에는 항상 RelativeLayouts를 사용하십시오. LinearLayout은 이러한 용도로 사용되지 않습니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/db1_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!-- Place your layout here -->

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom"
        android:orientation="horizontal"
        android:paddingLeft="20dp"
        android:paddingRight="20dp" >

        <Button
            android:id="@+id/setup_macroSavebtn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Save" />

        <Button
            android:id="@+id/setup_macroCancelbtn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Cancel" />

        </LinearLayout>

</RelativeLayout>

2

에서 사용 android:layout_alignParentBottom="true" 하십시오 <RelativeLayout>.

이것은 확실히 도움이 될 것입니다.


1
그것은 사용자가 RelativeLayout을 사용하기를 원한다고 가정합니다.
IgorGanapolsky

2

다음과 같은 계층 구조가있는 경우 :

<ScrollView> 
  |-- <RelativeLayout> 
    |-- <LinearLayout>

첫째, 적용 android:fillViewport="true"받는 ScrollView다음 적용을 android:layout_alignParentBottom="true"받는 LinearLayout.

이것은 나를 위해 완벽하게 작동했습니다.

<ScrollView
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:scrollbars="none"
    android:fillViewport="true">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:id="@+id/linearLayoutHorizontal"
            android:layout_alignParentBottom="true">
        </LinearLayout>
    </RelativeLayout>
</ScrollView>

2

상위 자식보기 (TextView @ + id / TextView )에 속성을 부여하면 android:layout_weight="1"됩니다.

그러면 아래의 다른 모든 요소가 맨 아래로 강제됩니다.


2

이것은 선형 레이아웃으로도 가능합니다.

위의 레이아웃과 아래쪽에 원하는 레이아웃에 Height = 0dp 및 weight = 1을 제공하십시오. 높이 = 랩 내용을 쓰고 무게는 쓰지 마십시오.

레이아웃에 대한 줄 바꿈 내용 (편집 텍스트 및 단추가 포함 된 내용)과 가중치가있는 내용은 나머지 레이아웃을 차지합니다.

나는 우연히 이것을 발견했다.


0

Janusz가 게시 한 솔루션을 사용했지만 레이아웃의 상단 부분이 ScrollView이므로 마지막보기에 패딩을 추가했습니다.

ScrollView는 내용이 커질수록 부분적으로 숨겨집니다. 사용 android:paddingBottom마지막보기를하면있는 ScrollView의 모든 내용을 표시 할 수 있습니다.

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