Подтвердить что ты не робот

Почему поле 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"

Могу ли я узнать, почему это так происходит?

4b9b3361

Ответ 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"