Настройка параметров макета в Android - PullRequest
16 голосов
/ 23 июня 2011

Работать с XML-файлом было легко, так как я мог указать параметры как

<android:layout_width="fill_parent" android:layout_height="wrap_content">

Но я не совсем понимаю, когда указываю это через код. Для каждого вида я указываю параметры, используя

view.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT)); 

Я вижу, что у меня есть возможность указать его как относительное расположение, расположение кадра и т. Д. На данный момент я использую линейный макет для всех видов, таких как изображения, текст, а также вид сетки. Должны ли параметры представления быть определены на основе макета родительского элемента? Или можно указать его как линейный макет, даже если представление является дочерним, скажем, для структуры кадра? Извините, но я не смог найти разницу.

Ответы [ 2 ]

17 голосов
/ 23 июня 2011

Все классы макетов (LinearLayout, RelativeLayout и т. Д.) Расширяются ViewGroup.

Класс ViewGroup имеет два статических внутренних класса: LayoutParams и MarginLayoutParamsViewGroup.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.

10 голосов
/ 02 мая 2012

В зависимости от того, сколько видов вы хотите изменить макеты, я думаю, что лучше создать вспомогательный метод и передать любые представления, которые вы хотите изменить, в метод вместе со значениями высоты и ширины, на которые вы хотите их изменить:

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

...