모든 것 앞에서 시야를 확보하는 방법?


130

나는 활동과 많은 위젯을 가지고 있으며, 그들 중 일부는 애니메이션을 가지고 있으며 애니메이션 때문에 일부 위젯이 서로 이동 (번역)하고 있습니다. 예를 들어 텍스트보기가 일부 버튼 위로 이동하고 있습니다. . .

이제 버튼이 항상 앞에 있기를 원합니다. 그리고 텍스트 뷰가 움직일 때 버튼 뒤로 이동하고 싶습니다.

이 작업을 수행 할 수 없어 내가 아는 모든 것을 시도했지만 "bringToFront ()"가 제대로 작동하지 않습니다.

참고 나는 단순히 할 수없는 레이아웃 원인에 요소를 배치하는 순서에 따라 z 순서를 제어하고 싶지 않습니다.


3
RelativeLayoutXML에서 마지막에 나타나는 "상단"보기와 함께를 사용했습니다 . stackoverflow.com/a/31340762/1121497
Ferran Maylinch

누구나 'bringToFront'의 xml로 해당 코드를 알려주십시오
Shirish Herwade

XML에서 고도 bottomView = elevation : 1dp 및 topView = elevation : 2dp를 사용해보십시오 || ViewCompat.setElevation (View, int)
Tlacaelel 라몬 루이스

답변:


144

전면에서 가져 오려는 뷰에서 bringToFront ()를 호출 할 수 있습니다.

이것은 예입니다 :

    yourView.bringToFront();

4
예기치 않은 결과 : 수직 선형 레이아웃에서 사용하고 정면 A / B / C으로 가져온 보기가 맨 아래에 나타났습니다 ... 예를 들어 A정면 으로 가져오고 싶었 a.bringToFront()습니다 B / C / A.
Ferran Maylinch

2
그래서 LinearLayout와 함께 사용할 수 없다는 것을 알았 습니다 bringToFront. 나는을 사용하여 끝났다 RelativeLayout. 질문 자체에 대한 내 의견을 참조하십시오.
Ferran Maylinch

1
누구나 'bringToFront'의 xml로 해당 코드를 알려주십시오.
Shirish Herwade

어떤 이유로 든 전면으로 이동하는 요소의 위치가 변경됩니다. ViewCompat.setTranslationZ(view, 1)반면에 완벽하게 작동합니다.
Bimde

1
yourView.bringToFront ()보다 활동에서 매니페스트 android : theme = "@ android : style / Theme.Light.NoTitleBar"에서 사용한 경우 완벽하게 작동하지만 android : theme = "@ android : style / Theme.AppCompat.Light.NoActionBar"yourView.bringToFront (); 작동하지 않습니다. 그에 대한 단서.
Rahul

42

나는 좋은 답변을 찾기 위해 스택 오버플로를 살펴 보았고 찾을 수 없을 때 문서를 살펴 보았습니다.

아직이 간단한 답변을 우연히 본 사람은 없습니다.

ViewCompat.setTranslationZ(view, translationZ);

기본 번역 z는 0.0


이는 Z 축에서 요소의 위치를 ​​px라고하며 높이라고도합니다. setTranslationX는 뷰를 X 축 (왼쪽 / 오른쪽)을 따라 이동하고 setTranslationY를 Y 축 (위 / 아래)을 따라 이동합니다. Z 축은 세 번째 축입니다.
xdevs23

무엇에 대해 setZ()? 내가 정확하게 기억한다면, 뷰의 Z 위치는 결국 높이와 변환 Z입니다.
Gensoukyou1337

2
@ Gensoukyou1337 ViewCompat.setZ(view, yourValueInPixels); view.setZ()은 API 21 이상에서만 작동합니다.
Johnny Five

1
Android Studio에서 Java 8 코드를 확인했습니다. SDK_INT> = 21인지 확인하기 때문에 <21 api의 경우 효과가 없습니다.
Vadim

32

더 간단한 해결책은 활동의 XML을 편집하는 것입니다. 사용하다

android:translationZ=""

3
이것은 Android API 21 이상에서만 유용합니다.
isakbob

25

bringToFront()올바른 방법이지만 루트 뷰 아래의 최상위 뷰에서 다음 bringToFront()과 같이 호출 하고 invalidate()메서드 를 지정해야합니다 .

뷰의 계층 구조는 다음과 같습니다.

-RelativeLayout
|--LinearLayout1
|------Button1
|------Button2
|------Button3
|--ImageView
|--LinearLayout2
|------Button4
|------Button5
|------Button6

따라서 버튼을 다시 애니메이션화하면 (1-> 6) 버튼이 (아래) 아래에있게 ImageView됩니다. 그것을 위 (위)로 가져 오려면 ImageView전화 bringToFront()invalidate()걸어서 메소드를 작성해야 LinearLayout합니다. 그런 다음 작동합니다.) ** 참고 : android:clipChildren="false"루트 레이아웃 또는 애니메이션 뷰의 gradparent_layout 을 설정 해야합니다. 내 실제 코드를 살펴 보겠습니다.

.xml

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

    <com.binh.helloworld.customviews.HWActionBar
        android:id="@+id/action_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_actionbar_height"
        android:layout_alignParentTop="true"
        hw:titleText="@string/app_name" >
    </com.binh.helloworld.customviews.HWActionBar>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/action_bar"
        android:clipChildren="false" >

        <LinearLayout
            android:id="@+id/layout_top"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >
        </LinearLayout>

        <ImageView
            android:id="@+id/imgv_main"
            android:layout_width="@dimen/common_imgv_height"
            android:layout_height="@dimen/common_imgv_height"
            android:layout_centerInParent="true"
            android:contentDescription="@string/app_name"
            android:src="@drawable/ic_launcher" />

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

</RelativeLayout>

.java의 일부 코드

private LinearLayout layoutTop, layoutBottom;
...
layoutTop = (LinearLayout) rootView.findViewById(R.id.layout_top);
layoutBottom = (LinearLayout) rootView.findViewById(R.id.layout_bottom);
...
//when animate back
//dragedView is my layoutTop's child view (i added programmatically) (like buttons in above example) 
dragedView.setVisibility(View.GONE);
layoutTop.bringToFront();
layoutTop.invalidate();
dragedView.startAnimation(animation); // TranslateAnimation
dragedView.setVisibility(View.VISIBLE);

!!


다른 버튼이 아닌 이미지 뷰 위에 버튼 6 만 가져 오려면 어떻게해야합니까?
Adam Katz

@AdamKatz : 다른 레벨의 주먹으로 다시 구성해야한다고 생각합니다. 그런 다음 자신의 방식으로 가져 오십시오.
Justin

고맙습니다. 리사이클 뷰의 한 항목을 뷰 위에 가져 오려고하지만 다른 항목은 그 아래에 두려고합니다.
Adam Katz

나는 똑같이 사용했다. 도구 모음을 숨기는 단일 문제로 정상적으로 작동합니다.
user2980181

여러 수준에서 작동합니까? ConstraintLayout을 포함하는 RelativeLayout을 가지고 있고 다른 하나 RelativeLayout는 모두 루트 ConstraintLayout( match_parent) 와 크기가 같다고 가정 해 봅시다 . 첫 번째 RelativeLayout는을 가지며 두 번째 Button뒤에 (z 순서) 뒤에 RelativeLayout있습니다. 내가 만들 수 Button처음에 RelativeLayout그것을 사용하여 볼 수 있고 클릭 할 수 있도록, 그것은 모든 것을 상단에있는 것처럼 나타날 View::bringToFront()?
oaskamay

25

이 코드를 XML로

 android:translationZ="90dp"

3
어디 90dp에서 왔습니까?
Sudhir Khanger

1
수동 입력입니다. 요구 사항에 따라 시도해 볼 수 있습니다. 45dp 또는 135dp 또는 180dp 또는 270dp
Krishna

1dp 만 사용할 수 없습니까?
타일러 턴불

18

시도해보십시오 FrameLayout. 뷰를 다른 뷰 위에 놓을 수 있습니다. 두 가지를 만들 수 있습니다 LinearLayouts전경 전망의 배경 전망 하나, 하나를, 그리고를 사용하여 결합 : FrameLayout. 도움이 되었기를 바랍니다.


1
대화 상자처럼 어떻게 맨 위로 가져올 수 있습니까?
Gaurav Arora

@Infinity,이 목적으로 FragmentDialog를 만들거나 액티비티에 Theme.Dialog를 사용할 수 있습니다.
Egor

API 10과 호환되지 않기 때문에 FragmentDialog를 사용할 수 없습니다. 둘째, 이미 내 응용 프로그램에 테마를 사용하고 있습니다. 다른 방법이 있습니까? 나는 당신이 말한 것처럼 그것을 FrameLayout 사용했습니다!
Gaurav Arora

@Infinity, API 4에서 사용할 수있는 FragmentDialog의 호환성 라이브러리 버전을 사용할 수 있습니다.
Egor

8

를 사용하는 경우 ConstraintLayout다른 요소 뒤에 요소를 넣어 다른 요소보다 앞에 배치하십시오.



3

하루를 절약하는 다른 방법이있을 수 있습니다. 원하는 레이아웃으로 새 대화 상자를 시작하고 표시하십시오. DialogFragment 위에 loadingView를 표시하려면 이것이 필요하며 이것이 내가 성공한 유일한 방법이었습니다.

Dialog topDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar);
topDialog.setContentView(R.layout.dialog_top);
topDialog.show();

bringToFront ()는 내 경우와 같이 작동하지 않을 수 있습니다. 그러나 dialog_top 레이아웃의 내용은 ui 레이어의 내용을 재정의해야합니다. 그러나 어쨌든 이것은 추악한 해결 방법입니다.


3

나는 같은 문제에 직면했다. 다음 해결책이 나를 위해 일했습니다.

 FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView);
        glFrame.addView(yourView);
        glFrame.bringToFront();
        glFrame.invalidate();

두 번째 해결책은 XML을 사용 하여이 속성을보기 XML에 추가하는 것입니다

android:translationZ=""

2

다음과 같이 BindingAdapter를 사용할 수 있습니다.

@BindingAdapter("bringToFront")
public static void bringToFront(View view, Boolean flag) {
    if (flag) {
        view.bringToFront();
    }
}


  <ImageView
        ...
        app:bringToFront="@{true}"/>

0

프레임 레이아웃을 사용해야합니다. 그리고 이것을하는 더 좋은 방법은 thay가 필요하지 않을 때 시야를 보이지 않게하는 것입니다. 또한 각 뷰마다 위치를 설정해야하므로 해당 위치에 따라 이동합니다.


0

당신이 사용하는 경우 LinearLayout당신이 호출해야 myView.bringToFront()후에 당신은 호출해야 parentView.requestLayout()하고 parentView.invalidate()새로운 자식 순서로 다시 그리도록 부모를 강제로.



0

스택 덕분에 사용자 이상 설명은, 난 안드로이드 4.1.1에서이 작업있어

((View)myView.getParent()).requestLayout();
myView.bringToFront();

예를 들어 내 동적 사용에서 나는

public void onMyClick(View v)
     {
     ((View)v.getParent()).requestLayout();
     v.bringToFront();
     }

그리고 Bamm!


-2

표시하려는 순서대로 정렬하십시오. 뷰 2 위에 뷰 1을 표시하고 뷰 2 코드를 작성한 다음 뷰 1 코드를 작성한다고 가정하십시오. 이 순서를 수행 할 수 없으면 가져 오려는 레이아웃의 루트보기로 bringToFront ()를 호출하십시오.


-32

다른보기의 가시성을 false로 설정할 수 있습니다.

view1.setVisibility(View.GONE);
view2.setVisibility(View.GONE);
...

또는

view1.setVisibility(View.INVISIBLE);
view2.setVisibility(View.INVISIBLE);
...

그리고 설정

viewN.setVisibility(View.VISIBLE);

4
모든 것이 보이도록해야합니다. 문제가 아닙니다. 문제는 z 순서입니다. 생존 가능성이 문제라면 해결하기 쉬울 것입니다. . .
Lukap
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.