Ruft die Stammansicht der aktuellen Aktivität ab

633

Ich weiß, wie man die Stammansicht mit View.getRootView () erhält . Ich kann die Ansicht auch von einem onClickEreignis einer Schaltfläche abrufen, bei dem das Argument eine Ansicht ist . Aber wie kann ich das bekommen Ansicht in einer Aktivität erhalten ?

Lalith
quelle
3
In der Aktivität geben Sie normalerweise an, mit welcher Ressource gerendert werden soll, setContentView()und die von Ihnen angegebene Ansicht ist bereits das Stammverzeichnis. Wenn Sie das Handle dieser Ansicht benötigen, geben Sie einfach eine ID in XAML ein und es findViewById()wäre in Ordnung.
Xandy
Mein Plan ist es, den Code dynamisch anzuhängen. Wenn meine Benutzer die API verwenden, erwarte ich, dass sie automatisch Dinge erkennt. Boulders Lösung funktioniert!
Lalith
4
@xandy: ein kleiner Tippfehler: XAML -> XML.
Superjos

Antworten:

1047

Wenn Sie eine Stammansicht Ihrer Aktivität benötigen (damit Sie Ihre Inhalte dort hinzufügen können), verwenden Sie

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

Es wurde auch berichtet, dass Sie auf einigen Geräten verwenden müssen

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

stattdessen.

Bitte beachten Sie, dass sich dies, wie Booger berichtete, auf einigen Geräten möglicherweise hinter der Navigationsleiste (mit Zurück-Taste usw.) befindet (auf den meisten Geräten scheint dies jedoch nicht der Fall zu sein).

Wenn Sie eine Ansicht erhalten setContentView()möchten, die Sie mithilfe der Methode zu Ihrer Aktivität hinzugefügt haben, können Sie diese wie im Topffleisch beschrieben verwenden

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

Aber setzen Sie besser einfach die ID auf diese Ansicht in Ihrem XML-Layout und verwenden Sie stattdessen diese ID.

Dmitry Ryadnenko
quelle
193
Nur findViewById (android.R.id.content) gibt mir die Root-Ansicht. Wenn dies in einigen Fällen nicht der Fall ist, kann ich die Stammansicht von findViewById (android.R.id.content) .getRootView () abrufen. Danke für die Antwort. Wo kann ich mehr über android.R erfahren? Ich war mir dessen nicht bewusst.
Lalith
4
Sie können hier überprüfen, ich nehme an, developer.android.com/reference/android/R.html Es ist nur eine Referenz zu Android-Ressourcen. Persönlich habe ich etwas über android.R.id.content gelernt und dann Layouts im Hierarchie-Viewer überprüft.
Dmitry Ryadnenko
14
Ich habe festgestellt, dass diese Ansicht anscheinend die Statusleiste enthält. Wenn Sie also nach dem sichtbaren Teil Ihrer Aktivität suchen, verwenden Sie die Antwort von @pottedmeat.
Ben Clayton
5
@Lalith, können Sie näher erläutern, wann Sie findViewById (android.R.id.content) .getRootView () ausführen mussten? Eine allgemeine Regel wäre wirklich nützlich zu wissen.
Batbrat
2
@ Batbrat Ich muss .getRootView () in Android 5.0+ verwenden, wenn ich die Aktionsleiste verwende
Morten Holmgaard
264

Dies ist, was ich verwende, um die Stammansicht zu erhalten, wie sie in der XML-Datei zu finden ist, die zugewiesen ist mit setContentView:

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);
Topffleisch
quelle
33
Diese Antwort gab die Ansicht ohne die Statusleiste - was ich wollte. Ich habe nach der Pixelbreite + Höhe des sichtbaren Teils der Aktivität gesucht. Dieser funktioniert, danke!
Ben Clayton
9
Dies schließt ActionBar aus!
Wayne
4
Gibt es eine Möglichkeit, auch das ActionBareinzubeziehen?
Theblang
3
Die Schlüsselwörter hier sind "die Stammansicht, wie sie in der XML-Datei gefunden wird". Vielen Dank.
Kacy
3
Dies sollte die richtige markierte Antwort sein. Dadurch wird die Snackbar in Ihrer Aktivität (an der Wurzel) platziert, wo sie sein sollte (ich bin mir ziemlich sicher, dass niemand seine Informationen hinter den Navigationsschaltflächen platzieren möchte)
Booger
136

Ich habe dies nur in Android 4.0.3 getestet:

getWindow().getDecorView().getRootView()

Geben Sie die gleiche Ansicht, was wir bekommen

anyview.getRootView();

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

und

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

Kind von seiner geben

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

Bitte bestätigen.

Sudar Nimalan
quelle
5
Android2.3.3 scheint gleich
ruX
2
Funktioniert in 4.3 Ist der einfachste Weg und die geringste Menge an Code, die ich gefunden habe.
Oliver Dixon
10
Am besten, wenn Sie SnackBar
zackygaurav
getWindow (). getDecorView (). getRootView (). getHeight () gibt die Anzeigehöhe zurück.
Vovahost
3
getWindow (). getDecorView (). getRootView () wird für die Snackbar nicht empfohlen, es überlappt die Systemnavigationsleiste, findViewById (android.R.id.content) ist besser.
thanhbinh84
31

Ruft die Stammansicht der aktuellen Aktivität ab.

Innerhalb unserer Aktivität können wir die rootAnsicht erhalten mit:

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

oder

View rootView = getWindow().getDecorView().getRootView();
Jorgesys
quelle
20

In Kotlin können wir es etwas kürzer machen:

val rootView = window.decorView.rootView
Artem Botnev
quelle
19

Nur für den Fall, dass jemand einen einfacheren Weg braucht:

Der folgende Code gibt einen Überblick über die gesamte Aktivität:

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

Um eine bestimmte Ansicht in der Aktivität zu erhalten, z. B. eine Bildansicht in der Aktivität, fügen Sie einfach die ID der Ansicht hinzu, die Sie erhalten möchten:

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

Hoffe das hilft jemandem

Salah Klein
quelle
5
Sie können findViewById(R.id.imageView1);die Aktivität einfach aufrufen, wenn Sie die spezifische Ansicht wünschen.
RobCo
3

anyview.getRootView(); wird der einfachste Weg sein.

Khemraj
quelle
1

um einen Überblick über die aktuelle Aktivität zu erhalten

In jedem onClick erhalten wir "View view", indem wir 'view' verwenden, um die rootView zu erhalten.

View view = view.getRootView ();

und um Ansicht in Fragment zu bekommen

Ansicht view = FragmentClass.getView ();

user3509903
quelle
1

Kotlin-Erweiterungslösung

Verwenden Sie diese Option, um den Zugriff in einer Aktivität zu vereinfachen. Dann können Sie direkt rootViewvon der Aktivität oder activity.rootViewaußerhalb darauf verweisen :

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

Wenn Sie aus Gründen der Konsistenz dasselbe für Fragmente hinzufügen möchten, fügen Sie Folgendes hinzu:

val Fragment.rootView get() = view?.rootView
Gibolt
quelle
0

Wenn Sie sich in einer Aktivität befinden, nehmen Sie an, dass es nur eine Stammansicht gibt. Sie können diese so abrufen.

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

Sie können es dann in Ihre echte Klasse umwandeln

oder du könntest verwenden

getWindow().getDecorView();

Beachten Sie, dass dies die Aktionsleistenansicht enthält. Ihre Ansicht befindet sich unterhalb der Aktionsleistenansicht

Bogenschütze Han
quelle
In der ActivityKlasse gibt es keine solche Methode .
Onelaview
window.decorView oder window.decorView als ViewGroup - wenn Sie es in die ViewGroup umwandeln müssen
Edgar Khimich
0

Für diejenigen unter Ihnen, die die Datenbindungsbibliothek verwenden , verwenden Sie einfach Folgendes , um die Wurzel der aktuellen Aktivität zu ermitteln:

View rootView = dataBinding.getRoot();

Und für Kotlin-Benutzer ist es noch einfacher:

val rootView = dataBinding.root
Alex Mamo
quelle
0

Eine weitere Kotlin Extension-Lösung

Wenn die Ansicht Ihrer Aktivität in xml (ex activity_root.xml) deklariert ist , öffnen Sie die xml und weisen Sie der Stammansicht eine ID zu:

android:id="@+id/root_activity"

Importieren Sie jetzt in Ihrer Klasse die Ansicht mit:

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

Sie können jetzt root_activityals Ansicht verwenden.

smac89
quelle