현재 활동에서 루트보기


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.