"Possible overdraw: l'élément racine peint l'arrière-plan "

En exécutant Android Lint sur mon projet, je suis tombé sur cet avertissement

Possible overdraw: l'élément racine peint l'arrière-plan @drawable / main avec un thème qui peint aussi un fond

Où le thème inféré est @android:style/Theme.NoTitleBar.Fullscreen

Quelqu'un Peut m'expliquer pourquoi cela arrive et comment le supprimer ??

Mon xml:

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/main" //***LINT warning***
        android:orientation="vertical"
        android:weightSum="3" >

La partie du manifeste où le thème est défini

 <application
        android:icon="@drawable/ic_logo"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
24
demandé sur hasanghaforian 2012-08-16 23:51:25

3 réponses

Pour optimiser les performances de vos applications (éviter l'overdraw), procédez comme suit:

  • Déclarer un thème dans res/values/styles.xml

    <style name="MyTheme" parent="android:Theme">
        <item name="android:background">@drawable/main</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
    </style>
    

  • Modifier le Manifeste:

    <application
        android:icon="@drawable/ic_logo"
        android:label="@string/app_name"
        android:theme="@style/MyTheme" >
    
  • supprimer la déclaration d'arrière-plan dans "mon xml"
17
répondu nvrandow 2013-06-24 05:03:15

Mise à Jour

Découvrez les commentaires ou découvrez ce lien. Comme le mentionne Marcin, ma solution ici n'est pas une bonne approche car elle peut provoquer des artefacts. Je l'utilise depuis longtemps pour éviter le dégainage sans aucun problème, mais en général, ce n'est peut-être pas un pouce de règle selon les commentaires de Chet Haase sur cette technique.

Réponse Originale à cette question

La meilleure approche que j'ai trouvée est de définir comme null l'arrière-plan par défaut et d'appliquer l'arrière-plan vous devez dans chaque modèle.

La raison en est que lorsque vous définissez un arrière-plan par défaut dans un thème, ou même des thèmes différents avec des arrière-plans différents comme suggéré ci-dessus, cela signifie que toute la mise en page sera remplie avec cet arrière-plan. Dans la plupart des cas, vous n'avez pas besoin d'un arrière-plan remplissant 100% de l'écran car vous avez des barres d'outils, des en-têtes, des pieds de page et d'autres éléments au-dessus de cet arrière-plan qui provoqueront un overdraw.

Pour appliquer un arrière-plan nul sur un thème:

<style
    name="ThemeName" parent="ParentTheme">
    <item name="android:windowBackground">@null</item>
</style>

Pour vérifier découvert activez simplement L'option Show Overdraw dans les options de développement de votre émulateur / périphérique. Ne faites pas confiance aux avertissements 100% lint car il y avait quelques bugs dans le tracker que je ne suis pas sûr d'être complètement corrigés.

Plus d'informations: qu'est-ce que l'overdraw et pourquoi est-ce un problème?

11
répondu Sotti 2016-08-08 09:03:28

La raison pour laquelle vous obtenez cet avertissement de peluches est que votre activité et votre disposition linéaire essaient tous deux de dessiner l'arrière-plan. Par conséquent, la zone visible est dessinée deux fois.

Comment déboguer ce? exécutez sdk / tools / hierarchyviewer et inspectez la hiérarchie de vue pour voir quelle vue a un arrière-plan qui n'est pas affiché. (Vous devez avoir un appareil android exécutant dev build rom)

Qu'est-ce qui se passe sous le capot? notez que presque tous les thèmes android ont un arrière-plan spécifié, ce qui signifie que si vous voulez créer un "LinearLayout" qui couvre tout l'écran et avec un backround, vous feriez mieux de définir windowBackground="@null" ou de supprimer le paramètre d'arrière-plan dans la mise en page linéaire.

2
répondu Ian Wong 2014-12-17 20:24:07