Урок 40. LayoutInflater. Учимся использовать.

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

Урок 40. LayoutInflater. Учимся использовать.

Сообщение damager82 » 08 дек 2011, 03:00

В этом уроке:

- разбираем как можно использовать LayoutInflater

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

Максим
Сообщения: 3
Зарегистрирован: 12 май 2012, 16:59

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение Максим » 22 май 2012, 21:51

"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."

Не понял, что вы хотели сказать этими предложениями. Как-то путано получилось. Хотя без этого абзаца в общем-то, всё ясно.

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение damager82 » 23 май 2012, 09:44

Максим писал(а):"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."

Не понял, что вы хотели сказать этими предложениями. Как-то путано получилось. Хотя без этого абзаца в общем-то, всё ясно.
Я здесь говорю о том, что inflate вернул не view, построенные из R.layout.text, а linLayout и relLayout, которые мы передавали в inflate в качестве второго параметра (root). Т.е. если строишь элемент из layout без привязки к родителю (третий параметр = false), то получаешь этот элемент. Если привязываешь к родителю (true), то получаешь уже родителя, а не тот элемент, который строил из layout.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение AndreyI » 24 май 2012, 07:36

Не плохо бы еще упомянуть о существовании индекса. Это очень важный параметр, если мы потом захотим получать доступ к дочерним элементам.
В ViewGroup каждому вновь добавленному элементу присваивается индекс, по которому можно легко потом получить доступ к дочерним элементам.
Основные методы для работы с индексами:
int getChildCount() - возвращает общее количество добавленных элементов в группе.
int indexOfChild(View child) - Возвращает позицию дочернего элемента в группе.
View getChildAt(int index) - Возвращает дочерний элемент по позиции в группе.
Так же часто приходится использовать метод View getParent() для "навигации" по вложенным элементам.
К примеру, возьмем типичную ситуацию - мы добавляем к ViewGroup другие группы в которые вложены отдельные View. И, скажем, по клику по такому отдельному элементу в функции обратного вызова onClick мы получаем ссылку на объект, по которому произведен этот клик. Но нам ведь нужно определить еще и в какой именно позиции он находится, но как и по каким признакам это сделать? Ведь все добавленные элементы как близнецы-братья содержат одинаковые ID, а также остальные поля также могут быть одинаковыми. Вот здесь на помощь и приходят индексы.
Алгоритм решения прост - с помощью getParent() добираемся до корневых элементов и через них получаем номер позиции (методом indexOfChild).

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение damager82 » 28 май 2012, 10:01

AndreyI писал(а):Не плохо бы еще упомянуть о существовании индекса. Это очень важный параметр, если мы потом захотим получать доступ к дочерним элементам.
Да, эту тему я не рассматривал.
Если есть желание, вы можете в Наработках сделать небольшой показательный пример.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение AndreyI » 28 май 2012, 11:50

Я предлагаю просто немного дополнить урок 41.
Добавим кнопку Del в разметку item.xml

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

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:text="Del" 
    android:onClick="OnClickDel" 
    android:layout_gravity="top|right"/>
А в класс MainActivity добавим обработчик этой кнопки:

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

public void OnClickDel(View v) {
	//Вызов getParent() возвращает FrameLayout в который вложена кнопка Del
	FrameLayout fl=(FrameLayout) v.getParent();
	//Определяем родительскую группу LinearLayout в которую мы добавляли item
	LinearLayout ll=(LinearLayout) fl.getParent();
	//Теперь у нас есть все данные, чтобы определить номер позиции в которой
	//находится item в родительской группе 
	int index=ll.indexOfChild(fl);
	//Зная индекс item в группе LinearLayout, можно удалить  элемент
	ll.removeViewAt(index);			
		}
Теперь при клике по кнопке del соответствующий ей пункт списка будет удаляться.
Разумеется это просто пример работы с индексами, удалить элемент можно и не находя индекс, вызвав, к примеру,
ll.removeView(fl). Индексы хорошо помогают организовать обработку содержимого ViewGroup в циклах и т.п.

Максим
Сообщения: 3
Зарегистрирован: 12 май 2012, 16:59

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение Максим » 30 май 2012, 18:43

damager82 писал(а):
Максим писал(а):"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."

Не понял, что вы хотели сказать этими предложениями. Как-то путано получилось. Хотя без этого абзаца в общем-то, всё ясно.
Я здесь говорю о том, что inflate вернул не view, построенные из R.layout.text, а linLayout и relLayout, которые мы передавали в inflate в качестве второго параметра (root). Т.е. если строишь элемент из layout без привязки к родителю (третий параметр = false), то получаешь этот элемент. Если привязываешь к родителю (true), то получаешь уже родителя, а не тот элемент, который строил из layout.
А, кажется, понял. Другими словами, в зависимости от значения третьего параметра, метод inflate возвращает либо наш элемент, созданный из layout-файла, либо родительский элемент с внедрённым в него нашим элементом.

Непонимание было вызвано отчасти неожиданностью присутствия в методе такой возможности - ума не приложу, зачем в процессе добавления элемента нам может вдруг понадобиться целый родитель? Вообще, привыкнув ранее к Дельфи, встречаю тут много неожиданного :)

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение damager82 » 31 май 2012, 16:20

Максим писал(а):Непонимание было вызвано отчасти неожиданностью присутствия в методе такой возможности - ума не приложу, зачем в процессе добавления элемента нам может вдруг понадобиться целый родитель? Вообще, привыкнув ранее к Дельфи, встречаю тут много неожиданного :)
Я тоже офигевал, когда разбирался с этим )
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение powercat » 12 сен 2012, 13:45

Так...попробую понять Инфлэйт делает из нескольких вьюшек, заданных в отдельном xml-файле ОДНУ вьюшку, прогнав xml-файл через себя? А потом эту вьюшку уже используем как один ээ...объект. Я правильно перефразировал действие инфлэйт?

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение AndreyI » 12 сен 2012, 14:18

Layout xml - файл это рецепт (описание объектов и их свойств), а LayoutInflater "готовит" (создает) объекты по этому рецепту.

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение powercat » 12 сен 2012, 17:20

А как это из сервиса реализовать...на getLayoutInflater() говорит, the method getLayoutInflater() is undefined for the type MyService

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение damager82 » 19 сен 2012, 16:15

powercat писал(а):А как это из сервиса реализовать...на getLayoutInflater() говорит, the method getLayoutInflater() is undefined for the type MyService

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

LayoutInflater inflater = (LayoutInflater)getSystemService (Context.LAYOUT_INFLATER_SERVICE);
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение powercat » 19 сен 2012, 16:20

Ок, буду пробовать

Overdos
Сообщения: 33
Зарегистрирован: 09 авг 2012, 20:58
Откуда: Краснодар

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение Overdos » 22 сен 2012, 10:22

Объясните пожалуйста, что такое android.R.layout.simple_expandable_list_item_1 для чего он и как он создается??? спасибо . и что такое конструктор ? на примере.

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение rezak90 » 22 сен 2012, 15:47

android.R.layout.simple_expandable_list_item_1 - это дефолтная разметка, можете указать свою (что желательно и делать)
что такое конструктор? - начните знакомство с ООП, а то будет трудно дальше. Пример:

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

class MyClass {
    MyClass() {} //это конструктор
}
R.id.team
Политика на форуме запрещена

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение caHek2x » 04 окт 2012, 03:04

добрый день ... может чучуть не по теме ... я делаю щас приложение ... и столкнулся с проблемой ...
у меня есть l_times.xml файл в котором поля для ввода ... к полям у меня привязаны
((EditText) findViewById(R.id.EditNanosec)).addTextChangedListener(new TextWatcher().....
так вот я изначально отображаю не этот файл в другой ... setContentView(R.layout.activity_convert);
потом я когда мне надо будет добавлю

LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
View childLayout = inflater.inflate(R.layout.l_times, (ViewGroup) findViewById(R.layout.l_times));
((LinearLayout) findViewById(R.id.LinearLayout1)).addView(childLayout);

так вот проблема в том что я немогу обращатся к компонентам до добавления ... и тоесть при привязывании addTextChangedListener у меня выдается ошибка .... что делать ???

изначально у меня все view были на главном xml (activity_convert)
просто из за большого количества виевов начало подвисать приложения ... просто они у меня по группам и когда не используются я делал visible gone ... сейчас решил разделить группы view по файлам и когда они надо будут подгружать через addView .... что я не так делаю и как решить проблему с привязкой addTextChangedListener до добавления виева на экран ... ???

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение caHek2x » 04 окт 2012, 05:27

или не париться и оставить всё в одном xml как изначально и задумал ...
просто сейчас при запуске приложения высвечивается белый экран и думает секунд 5 ...
я так понимаю обрабатывая все view ... просто разделение этих виевов на файлы и подгрузка когда только нужно будет я считаю будет некой оптимизацией ...

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение rezak90 » 04 окт 2012, 09:36

Это велосипед. Я понимаю когда там для адаптеров нужны лейауты то создаются они конечно отдельно, но что бы приложение висло из-за того что много вьюшек первый раз слышу. Это же на сколько их много должно быть то? Скорее всего просто не оптимизирован сам код, а не лейауты. Бросайте код и посмотрим что бы убедиться.
R.id.team
Политика на форуме запрещена

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение caHek2x » 04 окт 2012, 10:46

больше чем 276 элементов ....
я в логи выводил что программа делает ... и она именно на сетконтентвиев подвисает в начале на 3-5 сек ...
вот поэтому и решил переместить по файлам ...
у меня программа конвертор едениц измерения ... и для каждой системы: время длина мощность и тд ... свой набор textview и edittext ... вот я и решил что для каждой величины былобы разумно перемести по файлам и подгружать только при выборе перевода именно в эту величину ....
Последний раз редактировалось caHek2x 04 окт 2012, 10:52, всего редактировалось 1 раз.

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

Re: Урок 40. LayoutInflater. Учимся использовать.

Сообщение rezak90 » 04 окт 2012, 10:51

а ну тогда разумно сделать например какой то спинер или радиобаттон при выборе которых подгружается в активити необходимый лейаут.
R.id.team
Политика на форуме запрещена

Ответить