Почему поле LinearLayout игнорируется при использовании в виде списка ListView
Мне было интересно, если я просто предоставил единственный слой LinearLayout
в виде списка строк ListView, его маржа будет проигнорирована.
Маржа будет проигнорирована при использовании представления строки ListView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
Однако, если я предоставляю двойной слой LinearLayout
, первый слой действует как слой "dummy", его маржа не будет игнорироваться.
У нас будет запас в представлении строк в ListView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/buyPortfolioLinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
Могу ли я узнать, почему это так происходит?
Ответы
Ответ 1
Дело в том, что поле LinearLayout
(child) запрашивает родительский макет (контейнер), чтобы дать дочернему макету значение поля x.
Итак, если родительские макеты LayoutParams поддерживают поля, то это поле соблюдается и применяется.
ListView
по умолчанию использует AbsListView.LayoutParams
, который не включает поддержку полей, только высоту и ширину, поэтому он просто игнорирует параметры значение для полей.
В то время как другие параметры макета, такие как ActionBar.LayoutParams
, FrameLayout.LayoutParams
, GridLayout.LayoutParams
, LinearLayout.LayoutParams
и RelativeLayout.LayoutParams
являются дочерними ViewGroup.MarginLayoutParams, который отличает значения дочерних полей.
Ответ 2
когда вы используете макет sigle, это означает, что это ваше окно, если вы примените к нему маржу, тогда вы будете запрашивать маржу этой суммы из родительского представления, но у нас нет родительского представления, поэтому маржа не будет работать,
на втором месте есть родительский вид и маржа поможет для внутреннего вида, но не для внешнего.
Ответ 3
Вместо добавления вложенного макета вы можете использовать прописку так:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="5dp"