Страница 1 из 4

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

Добавлено: 15 сен 2011, 03:00
damager82
В этом уроке мы:

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

Click here to read this article!

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

Добавлено: 09 янв 2012, 15:38
damager82
А если мы хотим отступ не в пикселах?

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

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

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

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

Добавлено: 11 янв 2012, 10:48
damager82
1) По поводу пакетов - это надо разрабов Android спрашивать, почему они так раскидали классы.

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

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

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

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

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

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

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

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

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

Добавлено: 20 май 2012, 14:00
icamys
У меня возник вопрос. Перечитывал урок и документацию несколько раз, и все равно есть недопонимание:

" Известные нам примеры 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. Объясните пожалуйста, в чем я ошибся?

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

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

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

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

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

Добавлено: 20 май 2012, 22:30
icamys
KamiSempai, вы опровергли то, что я написал. Тогда, пожалуйста, объясните как правильно?

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

и

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

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

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

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


Изображение

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

Добавлено: 26 май 2012, 16:34
andev
icamys, KamiSempai имел ввиду, что один является потомком другого, но это не значит что они равны.
Большое спасибо за наглядную диаграмму

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

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

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

Добавлено: 06 июн 2012, 09:12
damager82
Flactor писал(а):У меня вопрос - такое создание экранов кто-то использует или это просто "для общего развития"?
Для общего развития. Ну и если понадобится динамически экран менять, оно пригодится.

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

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

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

Добавлено: 23 июн 2012, 18:53
TheHorse
Вопрос не актуален, то что я хотел сделать, делается через новые Activity, о чем я уже прочитал в следующих уроках.

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

Добавлено: 13 сен 2012, 17:06
dil_android
Здравствуйте,

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

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.

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

Добавлено: 13 сен 2012, 17:26
rezak90
Я в теории не сильно силён, но скажу что вроде как всё правильно мыслите. Немножко не соглашусь только с этим:
View занимает прямоугольное пространство экрана и отвечает за отображение компонентов (включая окно
экрана) и генерацию событий (event handling).
View не обязательно может быть прямоуголным, и он не генерирует события (вот тута хз как правильно сказать, но наоборот к обработчику привязывается view);

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

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

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

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

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

Добавлено: 13 сен 2012, 18:36
dil_android
Как вы оба полагаете?