Страница 1 из 3
Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 08 дек 2011, 03:00
damager82
В этом уроке:
- разбираем как можно использовать LayoutInflater
Click here to read this article!
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 22 май 2012, 21:51
Максим
"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."
Не понял, что вы хотели сказать этими предложениями. Как-то путано получилось. Хотя без этого абзаца в общем-то, всё ясно.
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 23 май 2012, 09:44
damager82
Максим писал(а):"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."
Не понял, что вы хотели сказать этими предложениями. Как-то путано получилось. Хотя без этого абзаца в общем-то, всё ясно.
Я здесь говорю о том, что inflate вернул не view, построенные из R.layout.text, а linLayout и relLayout, которые мы передавали в inflate в качестве второго параметра (root). Т.е. если строишь элемент из layout без привязки к родителю (третий параметр = false), то получаешь этот элемент. Если привязываешь к родителю (true), то получаешь уже родителя, а не тот элемент, который строил из layout.
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 24 май 2012, 07:36
AndreyI
Не плохо бы еще упомянуть о существовании индекса. Это очень важный параметр, если мы потом захотим получать доступ к дочерним элементам.
В ViewGroup каждому вновь добавленному элементу присваивается индекс, по которому можно легко потом получить доступ к дочерним элементам.
Основные методы для работы с индексами:
int getChildCount() - возвращает общее количество добавленных элементов в группе.
int indexOfChild(View child) - Возвращает позицию дочернего элемента в группе.
View getChildAt(int index) - Возвращает дочерний элемент по позиции в группе.
Так же часто приходится использовать метод View getParent() для "навигации" по вложенным элементам.
К примеру, возьмем типичную ситуацию - мы добавляем к ViewGroup другие группы в которые вложены отдельные View. И, скажем, по клику по такому отдельному элементу в функции обратного вызова onClick мы получаем ссылку на объект, по которому произведен этот клик. Но нам ведь нужно определить еще и в какой именно позиции он находится, но как и по каким признакам это сделать? Ведь все добавленные элементы как близнецы-братья содержат одинаковые ID, а также остальные поля также могут быть одинаковыми. Вот здесь на помощь и приходят индексы.
Алгоритм решения прост - с помощью getParent() добираемся до корневых элементов и через них получаем номер позиции (методом indexOfChild).
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 28 май 2012, 10:01
damager82
AndreyI писал(а):Не плохо бы еще упомянуть о существовании индекса. Это очень важный параметр, если мы потом захотим получать доступ к дочерним элементам.
Да, эту тему я не рассматривал.
Если есть желание, вы можете в
Наработках сделать небольшой показательный пример.
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 28 май 2012, 11:50
AndreyI
Я предлагаю просто немного дополнить урок 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 в циклах и т.п.
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-файла, либо родительский элемент с внедрённым в него нашим элементом.
Непонимание было вызвано отчасти неожиданностью присутствия в методе такой возможности - ума не приложу, зачем в процессе добавления элемента нам может вдруг понадобиться целый родитель? Вообще, привыкнув ранее к Дельфи, встречаю тут много неожиданного
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 31 май 2012, 16:20
damager82
Максим писал(а):Непонимание было вызвано отчасти неожиданностью присутствия в методе такой возможности - ума не приложу, зачем в процессе добавления элемента нам может вдруг понадобиться целый родитель? Вообще, привыкнув ранее к Дельфи, встречаю тут много неожиданного
Я тоже офигевал, когда разбирался с этим )
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 12 сен 2012, 13:45
powercat
Так...попробую понять Инфлэйт делает из нескольких вьюшек, заданных в отдельном xml-файле ОДНУ вьюшку, прогнав xml-файл через себя? А потом эту вьюшку уже используем как один ээ...объект. Я правильно перефразировал действие инфлэйт?
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 12 сен 2012, 14:18
AndreyI
Layout xml - файл это рецепт (описание объектов и их свойств), а LayoutInflater "готовит" (создает) объекты по этому рецепту.
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 12 сен 2012, 17:20
powercat
А как это из сервиса реализовать...на getLayoutInflater() говорит, the method getLayoutInflater() is undefined for the type MyService
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 19 сен 2012, 16:15
damager82
powercat писал(а):А как это из сервиса реализовать...на getLayoutInflater() говорит, the method getLayoutInflater() is undefined for the type MyService
Код: Выделить всё
LayoutInflater inflater = (LayoutInflater)getSystemService (Context.LAYOUT_INFLATER_SERVICE);
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 19 сен 2012, 16:20
powercat
Ок, буду пробовать
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 22 сен 2012, 10:22
Overdos
Объясните пожалуйста, что такое android.R.layout.simple_expandable_list_item_1 для чего он и как он создается??? спасибо . и что такое конструктор ? на примере.
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 22 сен 2012, 15:47
rezak90
android.R.layout.simple_expandable_list_item_1 - это дефолтная разметка, можете указать свою (что желательно и делать)
что такое конструктор? - начните знакомство с ООП, а то будет трудно дальше. Пример:
Код: Выделить всё
class MyClass {
MyClass() {} //это конструктор
}
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 04 окт 2012, 03:04
caHek2x
добрый день ... может чучуть не по теме ... я делаю щас приложение ... и столкнулся с проблемой ...
у меня есть 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 до добавления виева на экран ... ???
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 04 окт 2012, 05:27
caHek2x
или не париться и оставить всё в одном xml как изначально и задумал ...
просто сейчас при запуске приложения высвечивается белый экран и думает секунд 5 ...
я так понимаю обрабатывая все view ... просто разделение этих виевов на файлы и подгрузка когда только нужно будет я считаю будет некой оптимизацией ...
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 04 окт 2012, 09:36
rezak90
Это велосипед. Я понимаю когда там для адаптеров нужны лейауты то создаются они конечно отдельно, но что бы приложение висло из-за того что много вьюшек первый раз слышу. Это же на сколько их много должно быть то? Скорее всего просто не оптимизирован сам код, а не лейауты. Бросайте код и посмотрим что бы убедиться.
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 04 окт 2012, 10:46
caHek2x
больше чем 276 элементов ....
я в логи выводил что программа делает ... и она именно на сетконтентвиев подвисает в начале на 3-5 сек ...
вот поэтому и решил переместить по файлам ...
у меня программа конвертор едениц измерения ... и для каждой системы: время длина мощность и тд ... свой набор textview и edittext ... вот я и решил что для каждой величины былобы разумно перемести по файлам и подгружать только при выборе перевода именно в эту величину ....
Re: Урок 40. LayoutInflater. Учимся использовать.
Добавлено: 04 окт 2012, 10:51
rezak90
а ну тогда разумно сделать например какой то спинер или радиобаттон при выборе которых подгружается в активити необходимый лейаут.