Obtenez une vue racine de l'activité en cours

634

Je sais comment obtenir la vue racine avec View.getRootView () . Je peux également obtenir la vue à partir d'un onClickévénement de bouton où l'argument est une vue . Mais comment obtenir la vue d'une activité ?

Lalith
la source
3
En activité, vous dites normalement quelle ressource il doit restituer setContentView()et la vue que vous avez fournie est déjà la racine. Si vous avez besoin de la poignée de cette vue, mettez simplement un ID dans XAML et ce findViewById()serait bien.
xandy
Mon plan est d'attacher le code dynamiquement .. donc si mes utilisateurs utilisent l'API, je m'attends à ce qu'il détecte automatiquement les choses .. La solution de Boulder fonctionne!
Lalith
4
@xandy: une légère faute de frappe: XAML -> XML.
superjos

Réponses:

1048

Si vous avez besoin d'une vue racine de votre activité (pour pouvoir y ajouter votre contenu), utilisez

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

Il a également été signalé que sur certains appareils, vous devez utiliser

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

au lieu.

Veuillez noter que, comme Booger l'a signalé, cela peut être derrière la barre de navigation (avec le bouton de retour, etc.) sur certains appareils (mais cela ne semble pas le cas sur la plupart des appareils).

Si vous devez obtenir la vue que vous avez ajoutée à votre activité à l'aide de la setContentView()méthode, comme l'écrit la viande en pot, vous pouvez utiliser

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

Mais mieux vaut simplement définir id sur cette vue dans votre mise en page XML et utiliser cet identifiant à la place.

Dmitry Ryadnenko
la source
194
En fait, juste findViewById (android.R.id.content) me donne la vue racine. Si ce n'est pas vrai dans certains cas, je peux obtenir la vue racine à partir de findViewById (android.R.id.content) .getRootView (). Merci d'avoir répondu. Où puis-je en savoir plus sur les trucs android.R? Je n'en étais pas conscient.
Lalith
4
Vous pouvez vérifier ici je suppose developer.android.com/reference/android/R.html C'est juste une référence de ressources Android. Personnellement, j'ai découvert android.R.id.content, puis vérifié les dispositions dans hierarchyviewer.
Dmitry Ryadnenko
14
J'ai remarqué que cette vue semble inclure la barre d'état, donc si vous recherchez la partie visible de votre activité, utilisez la réponse de @pottedmeat.
Ben Clayton
5
@Lalith, pouvez-vous préciser quand vous avez besoin de faire findViewById (android.R.id.content) .getRootView ()? Une règle générale serait vraiment utile à connaître.
batbrat
2
@batbrat J'ai besoin d'utiliser .getRootView () dans Android 5.0+ lors de l'utilisation de la barre d'action
Morten Holmgaard
264

C'est ce que j'utilise pour obtenir la vue racine trouvée dans le fichier XML affecté avec setContentView:

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);
viande en pot
la source
33
Cette réponse a donné la vue sans la barre d'état - c'est ce que je voulais. Je cherchais la largeur en pixels + la hauteur de la partie visible de l'activité. Celui-ci fonctionne, merci!
Ben Clayton
9
Cela exclut ActionBar!
Wayne
4
Existe-t-il un moyen d'inclure ActionBarégalement le?
theblang
3
Les mots clés ici sont "la vue racine trouvée dans le fichier XML". Je vous remercie.
Kacy
3
Ce devrait être la bonne réponse marquée. Cela placera la Snackbar dans votre activité (à la racine), qui est là où elle devrait être (je suis sûr que personne ne veut placer ses informations derrière les boutons de navigation)
Booger
136

J'ai testé cela dans Android 4.0.3, seulement:

getWindow().getDecorView().getRootView()

donner la même vue de ce que nous obtenons

anyview.getRootView();

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

et

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

donner à l'enfant de son

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

Veuillez confirmer.

Sudar Nimalan
la source
5
Android2.3.3 semble le même
ruX
2
Fonctionne en 4.3 Est le moyen le plus simple et le moins de code que j'ai trouvé.
Oliver Dixon
10
Meilleur si vous utilisez SnackBar
zackygaurav
getWindow (). getDecorView (). getRootView (). getHeight () renvoie la hauteur d'affichage.
vovahost
3
getWindow (). getDecorView (). getRootView () n'est pas recommandé pour le snack-bar, il chevauchera la barre de navigation du système, findViewById (android.R.id.content) sera meilleur.
thanhbinh84
31

Obtenez une vue racine de l'activité en cours.

À l'intérieur de notre activité, nous pouvons obtenir la rootvue avec:

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

ou

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

Dans Kotlin, nous pouvons le faire un peu plus court:

val rootView = window.decorView.rootView
Artem Botnev
la source
19

Il suffit que quelqu'un ait besoin d'un moyen plus simple:

Le code suivant donne une vue d'ensemble de l'activité:

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

Pour obtenir une vue certian dans l'activité, par exemple une imageView à l'intérieur de l'activité, ajoutez simplement l'id de la vue que vous souhaitez obtenir:

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

J'espère que cela aide quelqu'un

Salah Klein
la source
5
Vous pouvez simplement appeler findViewById(R.id.imageView1);l'activité si vous voulez la vue spécifique.
RobCo
3

anyview.getRootView(); sera le moyen le plus simple.

Khemraj
la source
2

Solution d'extension Kotlin

Utilisez-le pour simplifier l'accès à une activité. Ensuite, vous pouvez vous référer directement à rootViewpartir de l'activité, ou en activity.rootViewdehors de celle-ci:

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

Si vous souhaitez ajouter la même chose pour les fragments à des fins de cohérence, ajoutez:

val Fragment.rootView get() = view?.rootView
Gibolt
la source
1

pour obtenir une vue de l'activité en cours

dans n'importe quel onClick, nous obtiendrons "View view", en utilisant 'view', obtenez le rootView.

View view = view.getRootView ();

et pour obtenir View in fragment

Vue vue = FragmentClass.getView ();

user3509903
la source
0

si vous êtes dans une activité, supposez qu'il n'y a qu'une seule vue racine, vous pouvez l'obtenir comme ceci.

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

vous pouvez ensuite le lancer dans votre vraie classe

ou vous pourriez utiliser

getWindow().getDecorView();

notez que cela inclura la vue de la barre d'action, votre vue est en dessous de la vue de la barre d'action

bowman han
la source
Il n'y a pas une telle méthode en Activityclasse.
onelaview
window.decorView ou window.decorView en tant que ViewGroup - si vous devez le convertir en ViewGroup
Edgar Khimich
0

Pour ceux d'entre vous qui utilisent la bibliothèque de liaison de données , pour obtenir la racine de l'activité en cours, utilisez simplement:

View rootView = dataBinding.getRoot();

Et pour les utilisateurs de Kotlin, c'est encore plus simple:

val rootView = dataBinding.root
Alex Mamo
la source
0

Une autre solution d'extension Kotlin

Si la vue de votre activité est déclarée en xml (ex activity_root.xml), ouvrez le xml et attribuez un identifiant à la vue racine:

android:id="@+id/root_activity"

Maintenant dans votre classe, importez la vue en utilisant:

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

Vous pouvez maintenant l'utiliser root_activitycomme vue.

smac89
la source