Android에서 RelativeLayout의 Z 순서 정의


226

Android에서 RelativeLayout보기의 z 순서를 정의하고 싶습니다.

이 작업을 수행하는 한 가지 방법은 전화하는 것 bringToFront입니다.

더 좋은 방법이 있습니까? 레이아웃 xml에서 z 순서를 정의 할 수 있다면 좋을 것입니다.


4
View.bringToFront (); anser입니다
— Shirish Herwade

답변:


314

가장 쉬운 방법은보기가 XML 파일에 추가되는 순서에주의를 기울이는 것입니다. 파일에서 아래로 내려 가면 Z 축에서 더 높아집니다.

편집 : 여기 및 여기 에 Android 개발자 사이트에 설명되어 있습니다. (감사합니다 @flightplanner)


16
불행히도 항상 변경할 수있는 것은 아닙니다. 예를 들어, 상대 레이아웃에서 각 요소는 파일에 이전에 정의 된 요소에 대해서만 배치 할 수 있습니다
— Casebash

67
Casebash, 필자는 반드시 "@ + id / your_element_before_its_defined"를 사용하고 나중에 정의한 요소에서 동일한 ID를 사용해야한다고 생각하지 않습니다. 나는 이것에 대해 틀릴 수도 있습니다.이 레이아웃은 나에게 까다 롭지 만 확실히 작동한다는 인상을 얻습니다.
— tjb

7
tjb가 옳다 (그리고 그가 기쁘다). id에 대한 첫 번째 언급과 함께 @ + id를 사용하십시오. 예 : layout_above = "@ + id / some_id"
— Michiel

3
<item type = "id"name = "<your_id>"/>를 값 xml 파일에 넣은 다음 어디에서나 참조 할 수 있습니다.
— karl

8
나는 파티에 약 3 년 늦었다는 것을 알고 있지만 @hpique에 대한 답변으로 여기
— HexAndBugs

88

코드 에서이 작업을 수행하려면 할 수 있습니다

View.bringToFront();

문서를 참조하십시오


68

API 21 이상의 버튼 및 기타 요소는 고도가 높으므로 부모 레이아웃에 관계없이 요소의 xml 순서는 무시하십시오. 저것을 알아내는 데 시간이 걸렸습니다.


16
이 버그에 대한 해결책은 버튼 위에 렌더링하려는보기에서 setElevation (1000)을 호출하는 것이 었습니다.
— 구멍에서 발사

setElevation ()에는 API 레벨 21
— dp2050

21

API 레벨 21부터 Android에서 레이아웃 파일의 항목은 정답에 설명 된대로 파일 내에서 항목이 정렬되는 방식과 높이에서 Z 순서를 가져옵니다. 표고가 높을수록 항목이 Z 순서가 높아짐을 의미합니다. .

특히 XML 순서에 따라 Z 순서로 아래에 있어야하는 항목 위에 나타나는 단추의 경우 특히 문제가 발생할 수 있습니다. 이 문제를 해결하려면 android:elevation레이아웃 XML의 항목 중 원하는 Z 순서와 일치하도록 항목을 설정하십시오 .

레이아웃에서 요소의 높이를 설정하여 그림자를 드리 우기 시작합니다. 이 효과를 원하지 않으면 다음과 같이 코드로 그림자를 제거 할 수 있습니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
   myView.setOutlineProvider(null);
}

레이아웃 XML을 통해 상승 된보기의 그림자를 제거하는 방법을 찾지 못했습니다.


1
주석에서 언급했듯이을 사용할 수 있습니다 android:elevation="1000dp". 이 방법으로 그림자가 렌더링되지 않습니다.
— Vadim Kotov

15

같은 문제가 발생했습니다. 상대 레이아웃 parentView에는 childView1과 childView2라는 두 자녀가 있습니다. 처음에는 childView1을 childView2 위에 놓고 childView1을 childView2 위에 놓기를 원합니다. 어린이보기의 순서를 변경해도 문제가 해결되지 않았습니다. 나를 위해 일한 것은 parentView 와 내가 설정 한 코드에서 android : clipChildren = "false" 를 설정하는 것입니다.

childView1.bringToFront();

parentView.invalidate();

2
이것은 작동하고 Android는 나를 너무 슬프게합니다. child.bringToFront()함께 parent.invalidate()작동하지만 parent.bringChildToFront(child)하지 않습니다. 우리 모두 OS에서 기대하는 논리는 어디에 있습니까?
— Oliver Hausler

일부 뷰 (X 및 Y의 변환)에 애니메이션을 적용하기 위해 LinearLayout, FrameLayout 및 RelativeLayout에 대해 몇 가지 조합을 시도했지만 항상 문제가 발생했습니다 (중복 크기 또는 겹치지 않음). 마침내 android:clipChildren="false"트릭을 수행했습니다. 감사합니다!
— JCarlosR 2016 년


13

도입 이후 답변을 추가 할 것이라고 생각했습니다.

안드로이드 : 번역 Z

XML 필드가 조금 바뀌었다. 달리기를 제안하는 다른 답변들

childView1.bringToFront();

parentView.invalidate();

이 코드는 childView1을 XML 파일의 하드 코딩 된 android : translationZ가있는 뷰 앞에 가져 가지 않습니다. 나는 이것에 문제가 있었고 다른보기 에서이 필드를 제거하면 bringToFront ()가 잘 작동했습니다.


이것은 또한 안드로이드 5의 경우도 마찬가지입니다elevation
— shelll

5

API 21은 view.setElevation(float)내장되어 있습니다

ViewCompat.setElevation(view, float);이전 버전과의 호환성을 위해 사용

더 많은 방법 ViewCompat.setZ(v, pixels)과ViewCompat.setTranslationZ(v, pixels)

다른 방법은 버튼을 수집하거나 배열 addView을보고 RelativeLayout에 추가하는 데 사용 합니다.




0

XML에서보기 중 하나에 권한이 있는지 확인하십시오. 그렇다면 다른 항목에 표고를 추가하거나 표고를 제거하여 문제를 해결하십시오. 거기에서 다른 것보다 우선하는 것은 순서의 순서입니다.


0

또는 겹치는 버튼이나 뷰를 FrameLayout 안에 넣습니다. 그런 다음 xml 파일의 RelativeLayout은 추가 한 자식 레이아웃의 순서를 따릅니다.


0

아래 코드 샘플을 사용하여 동일한 결과를 얻을 수도 있습니다.

ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);

이전 버전과 호환됩니다. 여기서 mCardView이하이어야하는 도면이다 sourceView.

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