Настройка параметров макета в android

Работа с 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, должна быть типа, возвращаемого вашим представлением... Проверьте, какой тип возвращается в представлении и импортирует этот тип в свои операторы импорта.