Работа с XML файлом была простой, поскольку я мог указать параметры как
<android:layout_width="fill_parent" android:layout_height="wrap_content">
Но я смущен, указывая его с помощью кода. Для каждого представления я указываю параметры с помощью
view.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT));
Я вижу, что у меня есть возможность указать его как относительный макет, компоновку фрейма и т.д.
На данный момент я использую линейную компоновку для всех видов, таких как изображения, текст, а также gridview. Должны ли определяться параметры представления на основе макета родительского элемента? Или это нормально, чтобы указать его как линейную компоновку, даже если представление является дочерним, скажем, фреймэлей? Извините, но я не мог узнать разницу.
Ответ 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
.
Ответ 2
В зависимости от того, сколько просмотров вы хотите изменить макеты, я думаю, что лучше создать вспомогательный метод и передать все виды, которые вы хотите изменить, вместе с значениями высоты и ширины, которые вы хотите изменить:
public void setWidthHeight(View v, int width, int height){
LayoutParams lp;
lp = v.getLayoutParams();
lp.width = width;
lp.height = height;
v.setLayoutParams(lp);
}
Помните, что установка ширины и высоты здесь не будет соответствовать одинаковым значениям в вашем xml, т.е. android: layout_width = "32dp" не совпадает с lp.width = 32;
Кроме того, переменная типа LayoutParams, называемая lp, должна быть типа, возвращаемого вашим представлением... Проверьте, какой тип возвращается в представлении и импортирует этот тип в свои операторы импорта.