現在のアクティビティからルートビューを取得する


634

View.getRootView()でルートビューを取得する方法を知っています。onClick引数がViewであるボタンのイベントからビューを取得することもできます。しかし、どのように私は得ることができますビューの活動を


3
アクティビティでは、通常、どのリソースを使用setContentView()してレンダリングするかを指示し、指定したビューはすでにルートです。そのビューのハンドルが必要な場合は、XAMLでビューにIDを配置するだけで十分findViewById()です。
xandy

私の計画は、コードを動的に添付することです..したがって、ユーザーがAPIを使用する場合、それが自動的に検出することを期待しています..ボルダーのソリューションは機能します!
Lalith、2010

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、2010

4
あなたはここで確認することができます私は考えdeveloper.android.com/reference/android/R.htmlそれのちょうどアンドロイドリソース参照を。個人的に私はandroid.R.id.contentについて学び、hierarchyviewerでレイアウトを確認しました。
Dmitry Ryadnenko、2010

14
このビューにはステータスバーが含まれているようです。アクティビティの目に見える部分を探している場合は、@ pottedmeatからの回答を使用してください。
ベンクレイトン

5
@ Lalith、findViewById(android.R.id.content).getRootView()を実行する必要がある場合について詳しく説明できますか?一般的なルールは知っておくと本当に役に立ちます。
batbrat 14年

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
この答えは、ステータスバーなしのビューを与えました-これは私が欲しかったものです。アクティビティの表示部分のピクセル幅+高さを探していました。これはうまくいきます、ありがとう!
ベンクレイトン

9
これはActionBarを除外します!
ウェイン

4
を含める方法はありActionBarますか?
theblang 2014

3
ここでのキーワードは、「XMLファイルにあるルートビュー」です。ありがとうございました。
ケイシー2015

3
これは正しいマーク付きの答えでなければなりません。これにより、Snackbarがアクティビティ内(ルート)に配置されます。これは本来あるべき場所です(誰もNav Buttonsの後ろに情報を配置したくないと思います)
Booger

136

私はこれをandroid 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 '19

3
getWindow()。getDecorView()。getRootView()はスナックバーにはお勧めしません。システムナビゲーションバーと重なるため、findViewById(android.R.id.content)の方が適しています。
thanhbinh84 2017

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 2017


2

Kotlin拡張ソリューション

これを使用して、アクティビティでのアクセスを簡略化します。次にrootView、アクティビティから、またはアクティビティのactivity.rootView外部から直接参照できます。

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

一貫性を保つためにフラグメントに同じものを追加したい場合は、以下を追加します。

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

1

現在のアクティビティのビューを取得する

どのonClickでも、「view」を使用して「View view」を取得します。rootViewを取得します。

ビューを表示= view.getRootView();

フラグメントでビューを取得する

ビューを表示する= FragmentClass.getView();


0

アクティビティにいる場合は、ルートビューが1つしかないと想定すると、このように取得できます。

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

それを実際のクラスにキャストできます

またはあなたが使うことができます

getWindow().getDecorView();

これにはアクションバービューが含まれることに注意してください、あなたのビューはアクションバービューの下にあります


Activityクラスにはそのようなメソッドはありません。
onelaview 2016年

window.decorViewまたはwindow.decorViewをViewGroupとして-ViewGroupにキャストする必要がある場合
Edgar Khimich


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.