web-dev-qa-db-ja.com

「オーバードローの可能性:ルート要素が背景をペイントします」

AndroidプロジェクトでLintを実行しているときに、この警告に遭遇しました

オーバードローの可能性:ルート要素は、背景も描画するテーマで@ drawable/mainを背景に描画します

推定されるテーマは@Android:style/Theme.NoTitleBar.Fullscreen

誰かがなぜこれが来るのか、そしてそれを削除する方法を私に説明できますか?

私の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" >

マニフェストのテーマが定義されている部分

 <application
        Android:icon="@drawable/ic_logo"
        Android:label="@string/app_name"
        Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen" >
29

アプリのパフォーマンスを最適化するには(オーバードローを避けます)、次のようにします。

  • 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>
    
  • マニフェストを変更します。

    <application
        Android:icon="@drawable/ic_logo"
        Android:label="@string/app_name"
        Android:theme="@style/MyTheme" >
    
  • 「My xml」のバックグラウンド宣言を削除します
20
nvrandow

更新

コメントをチェックするか、 このリンク をチェックしてください。 Marcinが述べているように、ここでの私の解決策はアーティファクトを引き起こす可能性があるため、良いアプローチではありません。私は問題なく長い間オーバードローを回避するためにそれを使用してきましたが、このテクニックに関するChet Haaseのコメントによると、一般的にはルールの親指ではないかもしれません。

元の答え

私が見つけた最良のアプローチは、デフォルトの背景をnullに設定し、各レイアウトで必要な背景を適用することです。

その理由は、テーマにデフォルトの背景を設定したり、上記のように背景が異なるさまざまなテーマを設定したりすると、レイアウト全体がその背景で塗りつぶされることになります。ほとんどの場合、ツールバー、ヘッダー、フッター、その他の要素の上にオーバードローの原因となるツールバー、ヘッダー、フッターなどの要素があるため、画面の100%を占める背景は必要ありません。

テーマにヌル背景を適用するには:

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

オーバードローを確認するには、エミュレーター/デバイスのdevオプションのShow Overdrawオプションをアクティブにします。 100%lintの警告を信用しないでください。トラッカーには完全に修正されたとは思えないバグがいくつかあったためです。

詳細: オーバードローとは何ですか?なぜ問題があるのですか?

13
Sotti

この糸くずの警告が表示される理由は、アクティビティと線形レイアウトの両方が背景を描画しようとするためです。したがって、可視領域は2回描画されます。

これをデバッグする方法 sdk/tools/hierarchyviewerを実行し、ビュー階層を調べて、表示されていない背景を持つビューを確認します。 (Android dev build romを実行するデバイスが必要です)

内部で何が実行されていますか?ほとんどすべてのAndroidテーマには背景が指定されていることに注意してください。つまり、画面全体をカバーする「LinearLayout」を作成したい場合、バックラウンドでは、アクティビティのwindowBackground = "@ null"を設定するか、線形レイアウトの背景設定を削除することをお勧めします。

2
Ian Wong