현재 활동에서 루트보기


633

View.getRootView ()로 루트 뷰를 얻는 방법을 알고 있습니다. 또한 onClick인수가 View 인 버튼의 이벤트에서 보기를 얻을 수 있습니다 . 하지만 어떻게 내가 얻을 수있는 보기 에서 활동을 ?


3
활동 중에는 일반적으로 어떤 리소스를 사용하여 렌더링해야하는지 setContentView()제공 한 뷰가 이미 루트입니다. 해당 뷰의 핸들이 필요한 경우 XAML에 ID를 입력하면됩니다 findViewById().
— xandy

내 계획은 코드를 동적으로 첨부하는 것입니다 .. 따라서 사용자가 API를 사용하면 자동으로 물건을 감지 할 것으로 기대됩니다. Boulder의 솔루션이 작동합니다!
— Lalith

4
@ xandy : 약간의 오타 : XAML-> XML.
— superjos 2012 년

답변:


1048

활동에 대한 루트보기가 필요한 경우 (여기에 내용을 추가 할 수 있음)

findViewById(android.R.id.content).getRootView()

또한 일부 장치에서는 사용해야한다고보고되었습니다.

getWindow().getDecorView().findViewById(android.R.id.content)

대신에.

Booger가보고 한 바와 같이 일부 기기에서는 탐색 표시 줄 (뒤로 버튼 등) 뒤에있을 수 있지만 대부분의 기기에서는 그렇지 않은 것 같습니다.

당신이 setContentView()방법을 사용하여 활동에 추가 한보기를 얻을 필요가 있다면 pottedmeat이 쓴대로 사용할 수 있습니다

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

그러나 XML 레이아웃에서 ID를이보기로 설정하고 대신이 ID를 사용하는 것이 좋습니다.


194
실제로 findViewById (android.R.id.content)는 루트 뷰를 제공합니다. 그것이 사실이 아닌 경우 findViewById (android.R.id.content) .getRootView ()에서 루트보기를 얻을 수 있습니다. 답변 해주셔서 감사합니다. android.R에 대해 더 배울 수있는 곳은 어디입니까? 나는 그것을 몰랐다.
— Lalith

4
여기서 확인할 수 있습니다. developer.android.com/reference/android/R.html 그것은 안드로이드 리소스 참조 일뿐입니다. 개인적으로 android.R.id.content에 대해 배운 다음 hierarchyviewer에서 레이아웃을 확인했습니다.
— Dmitry Ryadnenko

14
이보기에는 상태 표시 줄이 포함되어있는 것으로 나타났습니다. 활동의 보이는 부분을 찾으려면 @pottedmeat의 답변을 사용하십시오.
— Ben Clayton

5
@Lalith, findViewById (android.R.id.content) .getRootView ()를 수행해야 할 때 자세히 설명해 주시겠습니까? 일반적인 규칙은 정말 유용합니다.
— batbrat

2
@batbrat 액션 바를 사용할 때 Android 5.0 이상에서 .getRootView ()를 사용해야합니다
— Morten Holmgaard

264

이것은 내가 할당 된 XML 파일에서 발견 된 루트보기를 얻는 데 사용하는 것입니다 setContentView.

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

33
이 답변은 상태 표시 줄이없는보기를 제공했습니다. 활동의 보이는 부분의 픽셀 너비 + 높이를 찾고있었습니다. 고마워요!
— Ben Clayton

9
ActionBar는 제외됩니다!
— Wayne

4
포함하는 방법이 ActionBar있습니까?
— theblang

3
여기서 핵심 단어는 "XML 파일에있는 루트 뷰"입니다. 감사합니다.
— Kacy

3
정답이 표시되어야합니다. 이렇게하면 스낵바가 액티비티 (루트에서) 안에 위치하게됩니다. (Nav 버튼 뒤에 아무도 정보를 저장하고 싶지 않다고 확신합니다)
— Booger

136

나는 이것을 안드로이드 4.0.3에서 테스트했다.

getWindow().getDecorView().getRootView()

우리가 얻는 것과 같은 견해를 주다

anyview.getRootView();

com.android.internal.policy.impl.PhoneWindow$DecorView@#########

과

getWindow().getDecorView().findViewById(android.R.id.content)

아이에게주는

android.widget.FrameLayout@#######

확인 해주세요.


5
Android2.3.3은 동일하게 보입니다
— ruX

2
4.3에서 작동합니다. 내가 찾은 가장 쉬운 방법이고 가장 적은 양의 코드입니다.
— Oliver Dixon

10
SnackBar를 사용하는 경우 최고
— zackygaurav

getWindow (). getDecorView (). getRootView (). getHeight () 는 표시 높이를 반환합니다.
— vovahost

3
getWindow (). getDecorView (). getRootView ()는 스낵바에 권장되지 않으며 시스템 탐색 바와 겹치게되며 findViewById (android.R.id.content)가 더 좋습니다.
— thanhbinh84

31

현재 활동에서 루트 뷰를 가져옵니다.

우리의 활동 안에서 우리 root는 다음과 같은 견해를 얻을 수 있습니다 .

ViewGroup rootView = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

또는

View rootView = getWindow().getDecorView().getRootView();


19

누군가 더 쉬운 방법이 필요한 경우를 대비하여 :

다음 코드는 전체 활동을 보여줍니다.

View v1 = getWindow().getDecorView().getRootView();

액티비티에서 certian 뷰를 얻으려면 (예 : 액티비티 내부의 imageView) 가져 오려는 뷰의 ID를 추가하십시오.

View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1);

희망이 누군가에게 도움이되기를 바랍니다.


5
findViewById(R.id.imageView1);특정 뷰를 원하면 액티비티를 호출 하면됩니다.
— RobCo


2

코 틀린 확장 솔루션

이를 사용하여 활동에서 액세스를 단순화하십시오. 그런 다음 rootView활동 또는 activity.rootView외부 에서 직접 참조 할 수 있습니다 .

val Activity.rootView get() = window.decorView.rootView

일관성을 위해 조각에 동일하게 추가하려면 다음을 추가하십시오.

val Fragment.rootView get() = view?.rootView

1

현재 활동을 볼 수

모든 onClick에서 "view"를 사용하여 'view'를 사용하여 rootView를 가져옵니다.

보기보기 = view.getRootView ();

조각으로보기를 얻으려면

보기보기 = FragmentClass.getView ();


0

활동 중이라면 루트 뷰가 하나만 있다고 가정하면 다음과 같이 얻을 수 있습니다.

ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
        .findViewById(android.R.id.content)).getChildAt(0);

그런 다음 실제 수업에 캐스트 할 수 있습니다.

또는 당신은 사용할 수 있습니다

getWindow().getDecorView();

여기에는 작업 표시 줄보기가 포함됩니다.보기가 작업 표시 줄보기 아래에 있습니다.


Activity수업 에는 그러한 방법이 없습니다 .
— onelaview

window.decorView 또는 window.decorView를 ViewGroup으로
— -ViewGroup

0

Data Binding Library를 사용하는 사람들은 현재 활동의 근본을 얻으려면 다음을 사용하십시오.

View rootView = dataBinding.getRoot();

Kotlin 사용자의 경우 훨씬 간단합니다.

val rootView = dataBinding.root

0

다른 Kotlin 확장 솔루션

활동보기가 xml (ex activity_root.xml)로 선언 된 경우 xml을 열고 루트보기에 ID를 지정하십시오.

android:id="@+id/root_activity"

이제 수업에서 다음을 사용하여 뷰를 가져옵니다.

import kotlinx.android.synthetic.main.activity_root.root_activity

이제 root_activity보기로 사용할 수 있습니다 .

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