Урок 16. Программное создание экрана. LayoutParams

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 16. Программное создание экрана. LayoutParams

Сообщение damager82 » 15 сен 2011, 03:00

В этом уроке мы:

- рисуем экран программно, а не через layout-файл

Click here to read this article!
Последний раз редактировалось damager82 28 апр 2017, 10:52, всего редактировалось 6 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение damager82 » 09 янв 2012, 15:38

А если мы хотим отступ не в пикселах?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение Mikhail_dev » 11 янв 2012, 10:24

Тут назрело парочка вопросов, если можно:
1.
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout.LayoutParams;
Я так понимаю LinearLayout это подкласс ViewGroup. Но почему тогда они в разных пакетах?

2. У вас в коде сначала отображается LinearLayout я так понимаю?
setContentView(linLayout, linLayoutParam);
А после идет добавление элементов. Наверное все же было лучше сначала добавить элементы, а потом уже отобразить панель? Просто помню при изучении Swing это был немаловажный фактор, ибо можно было наблюдать как форма наполняется элементами. Тут наверное тоже самое, когда элементов немало. Хотя может быть ошибаюсь.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение damager82 » 11 янв 2012, 10:48

1) По поводу пакетов - это надо разрабов Android спрашивать, почему они так раскидали классы.

В android.widget сложены визуальные компоненты. А android.view содержит классы, на которых работают эти компоненты.

2) Вообще, хороший вопрос ... Я не знаю как поведет себя система. Отобразит корень и начнет наполнять его элементами, или сначала полностью сформирует экран и только потом покажет. Надо копать тему.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
btx
Сообщения: 4
Зарегистрирован: 31 янв 2012, 18:00

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение btx » 01 фев 2012, 14:41

damager82 писал(а):
А если мы хотим отступ не в пикселах?
Поправьте меня, если я не прав, но в общей сложности можно DIP умножить на коэффициент плотности экрана.

Код: Выделить всё

int px = (int) (dip * getResources().getDisplayMetrics().density);

NobodyCallMeChicken
Сообщения: 17
Зарегистрирован: 27 фев 2012, 10:53

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение NobodyCallMeChicken » 11 мар 2012, 06:48

Я бы добавил в этом уроке что такой подход является не желательным, т.к. используя ресурсы с разметкой, для разработки ГУИ, мы отделяем уровень представления от самого кода (или бизнес-логики). Что в итоге позволяет нам изменять внешний вид не затрагивая кода, можно применять оптимизированные файлы разметки под различные устройства, а не описывать все это вручную в коде. В общем плюсов у этого подхода перед описанным в уроке много.

icamys
Сообщения: 22
Зарегистрирован: 07 май 2012, 00:32

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение icamys » 20 май 2012, 14:00

У меня возник вопрос. Перечитывал урок и документацию несколько раз, и все равно есть недопонимание:

" Известные нам примеры ViewGroup – это LinearLayout, TableLayout, RelativeLayout и т.д. Каждая их этих ViewGroup имеет вложенный класс LayoutParams. Базовым для этих LayoutParams является ViewGroup.LayoutParams."

Отсюда делаю выводы:
1. ViewGroup = LinearLayout.
2. У LinearLayout есть подкласс LayoutParams. Т.е. обращаться к нему через LinearLayout.LayoutParams.


"ViewGroup.LayoutParams имеет всего два атрибута: height и width."

3. Окей. LinearLayout.LayoutParams имеет всего два аттрибута, height и width.


" Его подкласс ViewGroup.MarginLayoutParams наследует два этих атрибута и имеет свои четыре: bottomMargin, leftMargin, rightMargin, topMargin."

4. У LinearLayout.LayoutParams есть подкласс - MarginLayoutParams. К нему обращаться так: LinearLayout.LayoutParams.MarginLayoutParams .
5. Этот подкласс наследует свойства LinearLayout.LayoutParams + свои четыре.

" Класс LinearLayout.LayoutParams в свою очередь является подклассом ViewGroup.MarginLayoutParams, наследует от него уже 6 аттрибутов и добавляет свои два: gravity и weight. "

А вот здесь противоречие с выводом 4. Объясните пожалуйста, в чем я ошибся?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение KamiSempai » 20 май 2012, 20:17

:shock: Вы ошиблись уже в пункте 1. ViewGroup != LinearLayout. Прировнять эти два класса все равно, что сказать я свой отец, а этим может похвастаться только Чак Норис)

PS: У класса LinearLayout.LayoutParams нет подкласса MarginLayoutParams

Еще:
Áàçîâûì äëÿ ýòèõ LayoutParams ÿâëÿåòñÿ ViewGroup.LayoutParams.
LinearLayout.LayoutParams происходит от ViewGroup.MarginLayoutParams а не от ViewGroup.LayoutParams. Следовательно, пункт 3 тоже не правда.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

icamys
Сообщения: 22
Зарегистрирован: 07 май 2012, 00:32

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение icamys » 20 май 2012, 22:30

KamiSempai, вы опровергли то, что я написал. Тогда, пожалуйста, объясните как правильно?

" Известные нам примеры ViewGroup – это LinearLayout, TableLayout, RelativeLayout и т.д."

и

"Вы ошиблись уже в пункте 1. ViewGroup != LinearLayout."

уже идут в разрез.

icamys
Сообщения: 22
Зарегистрирован: 07 май 2012, 00:32

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение icamys » 20 май 2012, 23:34

В общем, покопался я в документации, и разобрался со всеми вопросами. Попутно, в поисках LinearLayout.LayoutParams составил небольшую схему иерархии классов. Может кому и понадобится.


Изображение

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение andev » 26 май 2012, 16:34

icamys, KamiSempai имел ввиду, что один является потомком другого, но это не значит что они равны.
Большое спасибо за наглядную диаграмму

Аватара пользователя
Flactor
Сообщения: 5
Зарегистрирован: 28 май 2012, 16:22

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение Flactor » 04 июн 2012, 21:59

У меня вопрос - такое создание экранов кто-то использует или это просто "для общего развития"? Потому как это на рнр-быдлокод смахивает, когда и рнр и html в одном файле навалены.
А вот layout в xml-файлах это уже православная шаблонизация

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение damager82 » 06 июн 2012, 09:12

Flactor писал(а):У меня вопрос - такое создание экранов кто-то использует или это просто "для общего развития"?
Для общего развития. Ну и если понадобится динамически экран менять, оно пригодится.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

TheHorse
Сообщения: 5
Зарегистрирован: 21 июн 2012, 15:34

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение TheHorse » 22 июн 2012, 12:30

Вопрос. У меня есть 2 лайаута main и explorer, притом explorer - и для layout-land. Мне бы хотелось программно переключится на этот лэйаут и как в примере, программно туда что-то допиливать, но я не знаю как получить экзепляр класса LinerLayout по его ID... Другими словами, я ищу что-то типа findLayoutById(R.layout.explorer);

TheHorse
Сообщения: 5
Зарегистрирован: 21 июн 2012, 15:34

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение TheHorse » 23 июн 2012, 18:53

Вопрос не актуален, то что я хотел сделать, делается через новые Activity, о чем я уже прочитал в следующих уроках.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение dil_android » 13 сен 2012, 17:06

Здравствуйте,

Может ли кто-нибудь уделить время, просмотреть текст и сказать правильно ли я пониманию иерархию классов и их функционал. Спасибо.

java.lang.Object
↳ android.view.View

View - строительная площадка для компонентов UI.
View занимает прямоугольное пространство экрана и отвечает за отображение компонентов (включая окно
экрана) и генерацию событий (event handling).
View базовый класс для виджетов, используемых для создания интерактивных UI компонентов (кнопки,
текстовые поля и т.д.)

java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup

ViewGroup - основной класс для разметки (layouts) компонентов и содержащих их контейнеров (view).
Включает подклассы LinearLayout, TableLayout, RelativeLayout и т.д.


java.lang.Object
↳ android.view.ViewGroup.LayoutParams

LayoutParams регулирует разметку (layout parameters) посредством атрибутов высоты (height) и ширины
(width)


java.lang.Object
↳ android.view.ViewGroup.LayoutParams
↳ android.view.ViewGroup.MarginLayoutParams

Подкласс,поддерживаюший установку отступов (margins) компонента (view).
Наследует два атрибута LayoutParams и имеет свои четыре: bottomMargin, leftMargin, rightMargin, topMargin.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение rezak90 » 13 сен 2012, 17:26

Я в теории не сильно силён, но скажу что вроде как всё правильно мыслите. Немножко не соглашусь только с этим:
View занимает прямоугольное пространство экрана и отвечает за отображение компонентов (включая окно
экрана) и генерацию событий (event handling).
View не обязательно может быть прямоуголным, и он не генерирует события (вот тута хз как правильно сказать, но наоборот к обработчику привязывается view);
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение AndreyI » 13 сен 2012, 18:25

dil_android
event handling - правильно переводится как обработка событий, в остальном все верно.
rezak90
occupies a rectangular area переводится как "занимает прямоугольную область"

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение dil_android » 13 сен 2012, 18:34

опередили меня AndreyI
действительно, отвечает за обработку событий, а прямоугольный это экран или круглый не имеет никакого значения. В моем понимании - это просто холст, на который можно выкладывать компоненты, в том числе окно (window) экрана, которое тоже является компонентой.
Остальное по моему правильно.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение dil_android » 13 сен 2012, 18:36

Как вы оба полагаете?

Ответить