Ответ 1
Все классы макета (LinearLayout
, RelativeLayout
и т.д.) расширяют ViewGroup
.
Класс ViewGroup
имеет два статических внутренних класса: LayoutParams
и MarginLayoutParams
. И ViewGroup.MarginLayoutParams
действительно расширяет ViewGroup.LayoutParams
.
Иногда макеты классов требуют дополнительной информации о макете, которая должна быть связана с дочерним видом. Для этого они определяют свой внутренний статический класс LayoutParams
. Например, LinearLayout
имеет:
public class LinearLayout extends ViewGroup {
...
public static class LayoutParams extends ViewGroup.MarginLayoutParams {
...
}
}
То же самое для RelativeLayout
:
public class RelativeLayout extends ViewGroup {
...
public static class LayoutParams extends ViewGroup.MarginLayoutParams {
...
}
}
Но LinearLayout.LayoutParams
и RelativeLayout.LayoutParams
- совершенно разные независимые классы. Они хранят различную дополнительную информацию о детях.
Например, LinearLayout.LayoutParams
может ассоциировать значение weight
с каждым представлением, а RelativeLayout.LayoutParams
не может. То же самое с RelativeLayout.LayoutParams
: он может связывать значения, такие как above
, below
, alightWithParent
с каждым представлением. И LinearLayout.LayoutParams
просто не имеют этих возможностей.
Так что в общем случае вам нужно использовать LayoutParams
для размещения макета, чтобы ваш взгляд был правильно позиционирован и отображен. Но учтите, что все LayoutParams
имеют один и тот же родительский класс ViewGroup.LayoutParams
. И если вы используете только функциональные возможности, определенные в этом классе (например, в вашем случае WRAP_CONTENT
и FILL_PARENT
), вы можете получить рабочий код, хотя для указания параметров макета использовался неправильный класс LayoutParams
.