Dlaczego 0dp jest uważany za zwiększenie wydajności?
Naodpowiedź na końcu tego pytania zostało wypełnione, łącząc uwagi i rozwiązania.
PytanieSzukałem w okolicy, ale nie znalazłem niczego, co naprawdę wyjaśnia dlaczegoAndroid Lint jak również niektóreZaćmienie podpowiedzi sugerują zastąpienie niektórychlayout_height
ilayout_width
wartości z0dp
.
Na przykład mamListView
zaproponowano zmianę
Przed
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
</ListView>
Po
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
Podobnie sugerował zmiany wElement ListView. Wszystkie wyglądają tak samo przed i po zmianach, ale jestem zainteresowany zrozumieniem, dlaczego są to czynniki zwiększające wydajność.
Czy ktoś ma wyjaśnienie dlaczego? Jeśli to pomoże, tutaj jest ogólny układ zListView
.
<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>
OdpowiedźZamieszczam tutaj odpowiedź, ponieważ jest to naprawdę połączenie odpowiedzi i odnośników poniżej. Jeśli coś się mylę, daj mi znać.
ZJaka jest sztuczka z 0dip layout_height lub layouth_width?
Istnieją 3 ogólne atrybuty układu, które działająszerokość iwysokość
android:layout_height
android:layout_width
android:layout_weight
KiedyLinearLayout
jestpionowy, a późniejlayout_weight
wpłynie nawysokość dzieckaView
s (ListView
). Ustawianielayout_height
do0dp
spowoduje, że ten atrybut zostanie zignorowany.
Przykład
<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>
KiedyLinearLayout
jestpoziomy, a późniejlayout_weight
wpłynie naszerokość dzieckaView
s (ListView
). Ustawianielayout_width
do0dp
spowoduje, że ten atrybut zostanie zignorowany.
Przykład
<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>
Powodem, dla którego chcesz zignorować ten atrybut, jest to, że jeśli go nie zignorujesz, zostanie on użyty do obliczenia układu, który zużywa więcej czasu procesora.
Dodatkowo zapobiega to dezorientacji co do wyglądu układu przy użyciu kombinacji trzech atrybutów. Jest to wyróżnione przezProgramista @android w odpowiedzi poniżej.
Również,Android Lint iZaćmienie obaj mówią używać0dip
. Z poniższej odpowiedzi możesz skorzystać0dip
, 0dp
, 0px
, itp., ponieważ rozmiar zerowy jest taki sam w każdej jednostce.
Unikaj wrap_content na ListView
Jeśli kiedykolwiek zastanawiałeś się dlaczegogetView(...)
jest nazywany tak wiele razy, jak ja, okazuje się być powiązany zwrap_content
.
Za pomocąwrap_content
tak jak użyłem powyżej spowoduje wszystkie dzieciView
s do pomiaru, co spowoduje dalszy czas procesora. Ten pomiar spowoduje twojegetView(...)
być nazywanym. Przetestowałem to i tyle razygetView(...)
jest znacznie zmniejszona.
Kiedy korzystałemwrap_content
na dwóchListView
s,getView(...)
był nazywany 3 razy dla każdego rzędu na jednymListView
i 4 razy dla każdego rzędu po drugiej.
Zmiana na zalecaną0dp
, getView(...)
został wywołany tylko raz dla każdego wiersza. Jest to znaczna poprawa, ale ma więcej wspólnego z unikaniemwrap_content
naListView
niż robi0dp
.
Jednak sugestia0dp
z tego powodu znacznie poprawia wydajność.