web-dev-qa-db-ja.com

ネストされた重みがパフォーマンスに悪いのはなぜですか?代替案?

layout_weight属性を使用して異なるビュー間の比率を作成するレイアウトファイルをいくつか作成しました。

ある時点で、ネストされた重みに関するリント警告が表示され始めます。

だから、なぜネストされた重みがパフォーマンスに悪いのか、そして異なる画面サイズに使用でき、多くの次元dpi値を指定する必要のないビュー次元間の一定の比率を作成するより効率的な方法があるのだろうかいくつかのレイアウトファイル(さまざまな画面サイズの場合)を考えます。

ありがとうございました!

152
MobileCushion

次の理由により、ネストされた重みはパフォーマンスに悪影響を及ぼします。

レイアウトの重みでは、ウィジェットを2回測定する必要があります。重みがゼロ以外のLinearLayoutが重みがゼロ以外の別のLinearLayout内にネストされている場合、測定値の数は指数関数的に増加します。

RelativeLayout sを使用し、特定のdpi値を使用せずに、他のビューの場所に応じてビューを調整することをお勧めします。

137
C.d.

Update:ご存じのとおり、パーセントサポートライブラリはAPIレベル26から廃止されました。ConstraintLayoutは、同じフラットなxml構造を実現する新しい方法です。 。

Githubプロジェクトの更新

更新されたサンプル:

<Android.support.constraint.ConstraintLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <TextView
        Android:id="@+id/fifty_thirty"
        Android:layout_width="0dp"
        Android:layout_height="0dp"
        Android:background="#ffff8800"
        Android:gravity="center"
        Android:text="@string/fifty_fifty_text"
        Android:textColor="@Android:color/white"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent="0.5"
        Android:textSize="25sp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_default="percent"
        app:layout_constraintWidth_percent="0.5" />

    <TextView
        Android:layout_width="0dp"
        Android:layout_height="0dp"
        Android:background="#ffff5566"
        Android:gravity="center"
        Android:text="@string/fifty_fifty_text"
        Android:textColor="@Android:color/white"
        Android:textSize="25sp"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent="0.5"
        app:layout_constraintLeft_toRightOf="@id/fifty_thirty"
        app:layout_constraintTop_toBottomOf="@id/fifty_thirty"
        app:layout_constraintWidth_default="percent"
        app:layout_constraintWidth_percent="0.5" />

</Android.support.constraint.ConstraintLayout>

更新:素晴らしいニュースAndroidパーセントサポートライブラリは、パフォーマンスとネストされた乱雑な重みLinearLayoutの問題を解決します

compile 'com.Android.support:percent:23.0.0'

デモはこちら

同じことを示すために、この単純なレイアウトを検討してください。

percent support libray demo

<Android.support.percent.PercentRelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <TextView
        Android:id="@+id/fifty_huntv"
        Android:layout_width="0dp"
        Android:layout_height="0dp"
        Android:background="#ff7acfff"
        Android:text="20% - 50%"
        Android:textColor="@Android:color/white"
        app:layout_heightPercent="20%"
        app:layout_widthPercent="50%" />
    <TextView
        Android:layout_width="0dp"
        Android:layout_height="0dp"
        Android:layout_toRightOf="@id/fifty_huntv"
        Android:background="#ffff5566"
        Android:text="80%-50%"
        app:layout_heightPercent="80%"
        app:layout_widthPercent="50%"
        />

</Android.support.percent.PercentRelativeLayout>

ネストされたLinearLayout重み付きのパフォーマンス低下を回避しました。本当にすごい!!!。

62
nitesh

私は思う(そしておそらく私はこれに火をつけられるだろう)が、私の携帯電話にはクアッドコアプロセッサがあり、ほとんどの人の自宅のPCに匹敵する(完全に破壊されないとしても)と思う。

また、この種のハードウェア機能は電話の未来だと思います。

だから、ネストに夢中になっていない限り(MHOではレイアウトが4レベル以上になることはありませんし、おそらく間違っているのであれば、あなたの電話はあまり気にしないかもしれないという結論に達します重みを持つことについて。

パフォーマンスにはるかに大きな影響を与える可能性のある多くのことがありますが、プロセッサが余分な計算を行うことを心配します。

(私は少しユーモラスであり、この投稿から何かを真剣に受け取らないように注意してください、他にあなたが最初に最適化する必要がある他のアイデア、そして2-3レベルの深い重みを心配することは助けにはならないことに注意してくださいあなたの健康)

44
WIllJBD

ネストされたウェイトが悪い主な理由は、レイアウトにウェイトを持つ子がある場合、2回測定する必要があるためです(これはリント警告で言及されていると思います)。つまり、重み付きレイアウトも含む重み付きレイアウトは4回測定する必要があり、追加する重みの各「レイヤー」は2の累乗で測定値を増やします。

ICS(APIレベル14)に GridLayout が追加されました。これにより、以前は重みが必要だった多くのレイアウトでシンプルで「フラット」なソリューションが可能になりました。 Androidの以前のバージョン用に開発している場合、ウェイトを削除するのは少し難しくなりますが、RelativeLayoutを使用し、そのキャブにレイアウトを可能な限りフラット化すると、ネストされたウェイトの多くが削除されます。

10
Jave

重み付きのネストされたLinearLayoutsを回避する簡単なソリューションがあります-weighSumでTablelayoutを使用し、weightSumでネストされたLinearLayoutを使用します。TablelayoutはLinearLayout(orientation、weightSum、パフォーマンスが悪い」

例:

 <TableLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical"
        Android:weightSum="1">

        <ImageView
            Android:layout_width="match_parent"
            Android:layout_height="0dp"
            Android:layout_weight="0.8"/>


        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="0dp"
            Android:layout_weight="0.2"
            Android:orientation="horizontal"
            Android:weightSum="1">


            <ImageView
                Android:layout_height="match_parent"
                Android:layout_width="0dp"
                Android:layout_weight="0.4"/>

            <TextView
                Android:layout_height="match_parent"
                Android:layout_width="0dp"
                Android:layout_weight="0.6"/>


            </LinearLayout>

    </TableLayout>
3
eneyovich

唯一の選択肢は、onResumeと呼ばれる関数を作成し、すべてのサイズと位置を設定することだと思います。とにかく、重量でサイズのみ設定できますが、パディング(レイアウトはさらに複雑になりません)、textSize(これを何らかの形で補償することはできません)、行数などは設定できません。

0
Gangnus