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)?

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()

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 ...


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();

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


5

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


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))

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.


-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.


2
Comment cela répond-il à la question?
Onik
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.