Урок 40. LayoutInflater. Учимся использовать.
Урок 40. LayoutInflater. Учимся использовать.
Последний раз редактировалось damager82 01 май 2017, 16:42, всего редактировалось 5 раз.
Re: Урок 40. LayoutInflater. Учимся использовать.
"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."
Не понял, что вы хотели сказать этими предложениями. Как-то путано получилось. Хотя без этого абзаца в общем-то, всё ясно.
Не понял, что вы хотели сказать этими предложениями. Как-то путано получилось. Хотя без этого абзаца в общем-то, всё ясно.
Re: Урок 40. LayoutInflater. Учимся использовать.
Я здесь говорю о том, что inflate вернул не view, построенные из R.layout.text, а linLayout и relLayout, которые мы передавали в inflate в качестве второго параметра (root). Т.е. если строишь элемент из layout без привязки к родителю (третий параметр = false), то получаешь этот элемент. Если привязываешь к родителю (true), то получаешь уже родителя, а не тот элемент, который строил из layout.Максим писал(а):"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."
Не понял, что вы хотели сказать этими предложениями. Как-то путано получилось. Хотя без этого абзаца в общем-то, всё ясно.
Re: Урок 40. LayoutInflater. Учимся использовать.
Не плохо бы еще упомянуть о существовании индекса. Это очень важный параметр, если мы потом захотим получать доступ к дочерним элементам.
В ViewGroup каждому вновь добавленному элементу присваивается индекс, по которому можно легко потом получить доступ к дочерним элементам.
Основные методы для работы с индексами:
int getChildCount() - возвращает общее количество добавленных элементов в группе.
int indexOfChild(View child) - Возвращает позицию дочернего элемента в группе.
View getChildAt(int index) - Возвращает дочерний элемент по позиции в группе.
Так же часто приходится использовать метод View getParent() для "навигации" по вложенным элементам.
К примеру, возьмем типичную ситуацию - мы добавляем к ViewGroup другие группы в которые вложены отдельные View. И, скажем, по клику по такому отдельному элементу в функции обратного вызова onClick мы получаем ссылку на объект, по которому произведен этот клик. Но нам ведь нужно определить еще и в какой именно позиции он находится, но как и по каким признакам это сделать? Ведь все добавленные элементы как близнецы-братья содержат одинаковые ID, а также остальные поля также могут быть одинаковыми. Вот здесь на помощь и приходят индексы.
Алгоритм решения прост - с помощью getParent() добираемся до корневых элементов и через них получаем номер позиции (методом indexOfChild).
В ViewGroup каждому вновь добавленному элементу присваивается индекс, по которому можно легко потом получить доступ к дочерним элементам.
Основные методы для работы с индексами:
int getChildCount() - возвращает общее количество добавленных элементов в группе.
int indexOfChild(View child) - Возвращает позицию дочернего элемента в группе.
View getChildAt(int index) - Возвращает дочерний элемент по позиции в группе.
Так же часто приходится использовать метод View getParent() для "навигации" по вложенным элементам.
К примеру, возьмем типичную ситуацию - мы добавляем к ViewGroup другие группы в которые вложены отдельные View. И, скажем, по клику по такому отдельному элементу в функции обратного вызова onClick мы получаем ссылку на объект, по которому произведен этот клик. Но нам ведь нужно определить еще и в какой именно позиции он находится, но как и по каким признакам это сделать? Ведь все добавленные элементы как близнецы-братья содержат одинаковые ID, а также остальные поля также могут быть одинаковыми. Вот здесь на помощь и приходят индексы.
Алгоритм решения прост - с помощью getParent() добираемся до корневых элементов и через них получаем номер позиции (методом indexOfChild).
Re: Урок 40. LayoutInflater. Учимся использовать.
Да, эту тему я не рассматривал.AndreyI писал(а):Не плохо бы еще упомянуть о существовании индекса. Это очень важный параметр, если мы потом захотим получать доступ к дочерним элементам.
Если есть желание, вы можете в Наработках сделать небольшой показательный пример.
Re: Урок 40. LayoutInflater. Учимся использовать.
Я предлагаю просто немного дополнить урок 41.
Добавим кнопку Del в разметку item.xml
А в класс MainActivity добавим обработчик этой кнопки:
Теперь при клике по кнопке del соответствующий ей пункт списка будет удаляться.
Разумеется это просто пример работы с индексами, удалить элемент можно и не находя индекс, вызвав, к примеру,
ll.removeView(fl). Индексы хорошо помогают организовать обработку содержимого ViewGroup в циклах и т.п.
Добавим кнопку 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"/>
Код: Выделить всё
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);
}
Разумеется это просто пример работы с индексами, удалить элемент можно и не находя индекс, вызвав, к примеру,
ll.removeView(fl). Индексы хорошо помогают организовать обработку содержимого ViewGroup в циклах и т.п.
Re: Урок 40. LayoutInflater. Учимся использовать.
А, кажется, понял. Другими словами, в зависимости от значения третьего параметра, метод inflate возвращает либо наш элемент, созданный из layout-файла, либо родительский элемент с внедрённым в него нашим элементом.damager82 писал(а):Я здесь говорю о том, что inflate вернул не view, построенные из R.layout.text, а linLayout и relLayout, которые мы передавали в inflate в качестве второго параметра (root). Т.е. если строишь элемент из layout без привязки к родителю (третий параметр = false), то получаешь этот элемент. Если привязываешь к родителю (true), то получаешь уже родителя, а не тот элемент, который строил из layout.Максим писал(а):"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."
Не понял, что вы хотели сказать этими предложениями. Как-то путано получилось. Хотя без этого абзаца в общем-то, всё ясно.
Непонимание было вызвано отчасти неожиданностью присутствия в методе такой возможности - ума не приложу, зачем в процессе добавления элемента нам может вдруг понадобиться целый родитель? Вообще, привыкнув ранее к Дельфи, встречаю тут много неожиданного
Re: Урок 40. LayoutInflater. Учимся использовать.
Я тоже офигевал, когда разбирался с этим )Максим писал(а):Непонимание было вызвано отчасти неожиданностью присутствия в методе такой возможности - ума не приложу, зачем в процессе добавления элемента нам может вдруг понадобиться целый родитель? Вообще, привыкнув ранее к Дельфи, встречаю тут много неожиданного
Re: Урок 40. LayoutInflater. Учимся использовать.
Так...попробую понять Инфлэйт делает из нескольких вьюшек, заданных в отдельном xml-файле ОДНУ вьюшку, прогнав xml-файл через себя? А потом эту вьюшку уже используем как один ээ...объект. Я правильно перефразировал действие инфлэйт?
Re: Урок 40. LayoutInflater. Учимся использовать.
Layout xml - файл это рецепт (описание объектов и их свойств), а LayoutInflater "готовит" (создает) объекты по этому рецепту.
Re: Урок 40. LayoutInflater. Учимся использовать.
А как это из сервиса реализовать...на getLayoutInflater() говорит, the method getLayoutInflater() is undefined for the type MyService
Re: Урок 40. LayoutInflater. Учимся использовать.
powercat писал(а):А как это из сервиса реализовать...на getLayoutInflater() говорит, the method getLayoutInflater() is undefined for the type MyService
Код: Выделить всё
LayoutInflater inflater = (LayoutInflater)getSystemService (Context.LAYOUT_INFLATER_SERVICE);
Re: Урок 40. LayoutInflater. Учимся использовать.
Ок, буду пробовать
Re: Урок 40. LayoutInflater. Учимся использовать.
Объясните пожалуйста, что такое android.R.layout.simple_expandable_list_item_1 для чего он и как он создается??? спасибо . и что такое конструктор ? на примере.
Re: Урок 40. LayoutInflater. Учимся использовать.
android.R.layout.simple_expandable_list_item_1 - это дефолтная разметка, можете указать свою (что желательно и делать)
что такое конструктор? - начните знакомство с ООП, а то будет трудно дальше. Пример:
что такое конструктор? - начните знакомство с ООП, а то будет трудно дальше. Пример:
Код: Выделить всё
class MyClass {
MyClass() {} //это конструктор
}
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 40. LayoutInflater. Учимся использовать.
добрый день ... может чучуть не по теме ... я делаю щас приложение ... и столкнулся с проблемой ...
у меня есть 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 до добавления виева на экран ... ???
у меня есть 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. Учимся использовать.
или не париться и оставить всё в одном xml как изначально и задумал ...
просто сейчас при запуске приложения высвечивается белый экран и думает секунд 5 ...
я так понимаю обрабатывая все view ... просто разделение этих виевов на файлы и подгрузка когда только нужно будет я считаю будет некой оптимизацией ...
просто сейчас при запуске приложения высвечивается белый экран и думает секунд 5 ...
я так понимаю обрабатывая все view ... просто разделение этих виевов на файлы и подгрузка когда только нужно будет я считаю будет некой оптимизацией ...
Re: Урок 40. LayoutInflater. Учимся использовать.
Это велосипед. Я понимаю когда там для адаптеров нужны лейауты то создаются они конечно отдельно, но что бы приложение висло из-за того что много вьюшек первый раз слышу. Это же на сколько их много должно быть то? Скорее всего просто не оптимизирован сам код, а не лейауты. Бросайте код и посмотрим что бы убедиться.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 40. LayoutInflater. Учимся использовать.
больше чем 276 элементов ....
я в логи выводил что программа делает ... и она именно на сетконтентвиев подвисает в начале на 3-5 сек ...
вот поэтому и решил переместить по файлам ...
у меня программа конвертор едениц измерения ... и для каждой системы: время длина мощность и тд ... свой набор textview и edittext ... вот я и решил что для каждой величины былобы разумно перемести по файлам и подгружать только при выборе перевода именно в эту величину ....
я в логи выводил что программа делает ... и она именно на сетконтентвиев подвисает в начале на 3-5 сек ...
вот поэтому и решил переместить по файлам ...
у меня программа конвертор едениц измерения ... и для каждой системы: время длина мощность и тд ... свой набор textview и edittext ... вот я и решил что для каждой величины былобы разумно перемести по файлам и подгружать только при выборе перевода именно в эту величину ....
Последний раз редактировалось caHek2x 04 окт 2012, 10:52, всего редактировалось 1 раз.
Re: Урок 40. LayoutInflater. Учимся использовать.
а ну тогда разумно сделать например какой то спинер или радиобаттон при выборе которых подгружается в активити необходимый лейаут.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена