Comment obtenir la vue du contenu de l'activité?

279

Quelle méthode dois-je appeler pour savoir si une activité a son contentView (une fois que la méthode setContentView () a été appelée)?

teoREtik
la source

Réponses:

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

ou

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

ou

this.findViewById(android.R.id.content).getRootView()
ernest
la source
4
ou getWindow().findViewById(android.R.id.content):)
Alex Lockwood
1
cela fonctionne très bien en ce qui concerne la récupération de la vue parent ... BUt..si j'essaie this.findViewById (android.R.id.content) .setBackgroundDrawable (d); il travail dosent .. Pouvez-vous s'il vous plaît suggérer .. Merci à l'avance
Rajesh Wadhwa
3
Si vous installez une disposition à partir de XML à l'aide de setContentView(R.layout.my_view), cela renvoie le parent de cette disposition.
Jay Lieske
Bonjour @ernest J'ai une question de tri comme Si dans ma mise en page, j'ai une image au-dessus de deux onglets dans la barre d'onglets. et en bas un SatelliteMenu, vous voulez faire du flou sur les éléments du menu sont ouverts.
Devendra Singh
1
le contenu n'existe pas pour Android.Resource.Id.
Justin
23

Vous pouvez obtenir la vue Retour si vous mettez un ID dans votre mise en page.

<RelativeLayout
    android:id="@+id/my_relative_layout_id"

Et appelez-le depuis findViewById ...

papachan
la source
Il s'agit du moyen le plus robuste pour obtenir la racine d'une mise en page installée.
Jay Lieske
3
À quoi passez-vous findViewById?
trans
1
@trans View contentView = findViewById (R.id.my_relative_layout_id);
Justin Liu
11

Que diriez-vous

View view = Activity.getCurrentFocus();
Mike Jones
la source
Comment cela n'a-t-il pas plus de pouce en l'air? Fonctionne très bien!
aeskreis
1
@aeskreis parce que dans mon cas, il retourne nullcurrentFocus?.let { ... }
user924
10

Vous voudrez peut-être essayer View.getRootView().

Will Tate
la source
5

Vous pouvez également remplacer onContentChanged()ce qui est, entre autres, déclenché lorsqu'il setContentView()a été appelé.

Chris
la source
La réponse d'ernest vous donnera la vue focalisée actuelle même si elle contient une vue
déroulante
2

Si vous utilisez Kotlin

    this.findViewById<View>(android.R.id.content)
                         .rootView
                         .setBackgroundColor(ContextCompat.getColor(this, R.color.black))
Hitesh Sahu
la source
1

Il n'y a pas de méthode "isContentViewSet". Vous pouvez placer un appel factice requestWindowFeature dans le bloc try / catch avant setContentView comme ceci:

essayez {
  requestWindowFeature (Window.FEATURE_CONTEXT_MENU);
  setContentView (...)
} catch (AndroidRuntimeException e) {
  // fais smth ou rien
}

Si la vue de contenu était déjà définie, requestWindowFeature lèvera une exception.

sergeytch
la source
-3

La meilleure option que j'ai trouvée et la moins intrusive, est de définir un paramètre de balise dans votre xml, comme

DISPOSITION XML DU TÉLÉPHONE

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="phone"/>

DISPOSITION XML DE LA TABLETTE

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="tablet">

    ...

</RelativeLayout>

puis appelez cela dans votre classe d'activité:

View viewPager = findViewById(R.id.pager);
Log.d(getClass().getSimpleName(), String.valueOf(viewPager.getTag()));

J'espère que cela fonctionne pour vous.

Alejandro Tellez
la source
2
Comment cela répond-il à la question?
Onik