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.