1. ホーム
  2. android

0dpが性能向上と言われるのはなぜですか?

2023-10-23 14:57:24

疑問点

質問 回答 は、備考と解答を組み合わせて記入されています。

質問内容

いろいろ検索してみましたが、なぜ Android Lint と同様に、いくつかの Eclipse ヒントは、いくつかの layout_heightlayout_width の値は 0dp .

例えば、私の場合は ListView を変更するよう提案されたものです。

以前

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1">
</ListView>

その後

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1">
</ListView>

同様に リストビューのアイテム . これらはすべて変更前と変更後では同じに見えますが、これらがパフォーマンス ブースターである理由を理解することに興味があります。

どなたか、その理由を説明できる方はいらっしゃいますか。役に立つのであれば、以下に一般的なレイアウトを示します。 ListView .

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ImageView
        android:id="@+id/logo_splash"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ImageView>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:background="@color/background"
        android:layout_below="@id/logo_splash">

        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">
        </ListView>

        <TextView
            android:id="@android:id/empty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/no_upcoming" />

    </LinearLayout>        
</RelativeLayout>

回答

私はここに答えを入れています。それは本当に答えと以下の参照リンクの組み合わせだからです。もし私が何か間違っていたら、教えてください。

から 0dip layout_heightやlayouth_widthのトリックは何ですか?

で動作する3つの一般的なレイアウト属性があります。 高さ

  1. android:layout_height
  2. android:layout_width
  3. android:layout_weight

を実行すると LinearLayout 垂直 であれば layout_weight 高さ の高さに影響します。 View s ( ListView ). を設定することで layout_height から 0dp に変更すると、この属性は無視されます。

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
    </ListView>
</LinearLayout>

を指定すると LinearLayout 水平 であれば layout_weight に影響します。 に影響します。 View s ( ListView ). を設定することで layout_width から 0dp に変更すると、この属性は無視されます。

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal">
    <ListView
        android:id="@android:id/list"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">
    </ListView>
</LinearLayout>

属性を無視したい理由は、もし無視しなければ、より多くのCPU時間を使うレイアウトの計算に使われるからです。

さらに、これは、3 つの属性の組み合わせを使用するときに、レイアウトがどのように見えるべきかという混乱を防ぎます。これは アンドロイド開発者 が以下の回答で強調しています。

また Android Lint Eclipse は、どちらも 0dip . 以下のその回答から、あなたは 0dip , 0dp , 0px などのように、どの単位でも同じサイズになります。

ListViewのwrap_contentを回避する。

から ListViewのLayout_width

もしあなたが今まで、なぜ getView(...) が何度も呼び出されるのを不思議に思っていたら、それは wrap_content .

使用方法 wrap_content を使うと、すべての子 View が測定され、さらに CPU 時間がかかります。この計測により、あなたの getView(...) が呼び出されます。今、これをテストしてみたところ、回数の多い getView(...) が呼び出される回数が劇的に減りました。

を使っていたときは wrap_content を使っていたとき、2つの ListView s, getView(...) は1つの行に対して3回ずつ呼び出され ListView が 3 回、もう一方の行が 4 回呼び出されます。

これを推奨される 0dp , getView(...) は各行に対して一度だけ呼び出されました。これはかなり改善されましたが、それ以上に wrap_content を避けるためです。 ListView よりも 0dp .

しかし 0dp の提案は、このために実質的にパフォーマンスを向上させます。

どのように解決するのですか?

まず、これがありますね。

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1">
</ListView>

リストビューの高さをwrap_contentに指定すると、トラブルの元になるので、絶対にしないでください。 Here がその理由であり this answer .

さらにさらに。

いろいろ検索してみましたが、理由を本当に説明しているものは見つかりませんでした。 Android Lint やいくつかの Eclipse のヒントでは、いくつかの layout_height と layout_width の値を 0dp に置き換えることを示唆しています。

それは、あなたが layout_weight = "1" を使用しているため、ListViewは利用可能な限りの高さを取ることを意味します。そのため、この場合は layout_height = "wrap_content" に変更するだけです。 android:layout_height="0dp" に変更すると、ListView の高さは layout_weight = "1" .