Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 24 фев 2017, 23:37

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 50 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 08 дек 2011, 04:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1319
Благодарил (а): 0 раз.
Поблагодарили: 69 раз.
В этом уроке:

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

Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 15 янв 2017, 15:01, всего редактировалось 4 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 май 2012, 22:51 

Зарегистрирован: 12 май 2012, 17:59
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 23 май 2012, 10:44 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1319
Благодарил (а): 0 раз.
Поблагодарили: 69 раз.
Максим писал(а):
"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."

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


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

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 май 2012, 08:36 

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 май 2012, 11:01 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1319
Благодарил (а): 0 раз.
Поблагодарили: 69 раз.
AndreyI писал(а):
Не плохо бы еще упомянуть о существовании индекса. Это очень важный параметр, если мы потом захотим получать доступ к дочерним элементам.

Да, эту тему я не рассматривал.
Если есть желание, вы можете в Наработках сделать небольшой показательный пример.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 май 2012, 12:50 

Зарегистрирован: 14 май 2012, 17:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Я предлагаю просто немного дополнить урок 41.
Добавим кнопку Del в разметку item.xml
Код: [ Загрузить ] [ Скрыть ]
Using XML Syntax Highlighting
  1. <Button
  2.    android:id="@+id/button1"
  3.    android:layout_width="wrap_content"
  4.    android:layout_height="40dp"
  5.    android:text="Del"
  6.    android:onClick="OnClickDel"
  7.    android:layout_gravity="top|right"/>
  8.  

А в класс MainActivity добавим обработчик этой кнопки:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public void OnClickDel(View v) {
  2.         //Вызов getParent() возвращает FrameLayout в который вложена кнопка Del
  3.         FrameLayout fl=(FrameLayout) v.getParent();
  4.         //Определяем родительскую группу LinearLayout в которую мы добавляли item
  5.         LinearLayout ll=(LinearLayout) fl.getParent();
  6.         //Теперь у нас есть все данные, чтобы определить номер позиции в которой
  7.         //находится item в родительской группе
  8.         int index=ll.indexOfChild(fl);
  9.         //Зная индекс item в группе LinearLayout, можно удалить  элемент
  10.         ll.removeViewAt(index);                
  11.                 }
  12.  


Теперь при клике по кнопке del соответствующий ей пункт списка будет удаляться.
Разумеется это просто пример работы с индексами, удалить элемент можно и не находя индекс, вызвав, к примеру,
ll.removeView(fl). Индексы хорошо помогают организовать обработку содержимого ViewGroup в циклах и т.п.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 май 2012, 19:43 

Зарегистрирован: 12 май 2012, 17:59
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
damager82 писал(а):
Максим писал(а):
"Т.е. метод inflate вернул нам не созданные из layout-файла View-элементы, а те, что мы указывали как root. А созданные из layout-файла View элементы он добавил в root как дочерние аналогично команде addView."

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


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


А, кажется, понял. Другими словами, в зависимости от значения третьего параметра, метод inflate возвращает либо наш элемент, созданный из layout-файла, либо родительский элемент с внедрённым в него нашим элементом.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 май 2012, 17:20 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1319
Благодарил (а): 0 раз.
Поблагодарили: 69 раз.
Максим писал(а):
Непонимание было вызвано отчасти неожиданностью присутствия в методе такой возможности - ума не приложу, зачем в процессе добавления элемента нам может вдруг понадобиться целый родитель? Вообще, привыкнув ранее к Дельфи, встречаю тут много неожиданного :)

Я тоже офигевал, когда разбирался с этим )

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 сен 2012, 14:45 
Аватар пользователя

Зарегистрирован: 20 июл 2012, 12:31
Сообщений: 506
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Так...попробую понять Инфлэйт делает из нескольких вьюшек, заданных в отдельном xml-файле ОДНУ вьюшку, прогнав xml-файл через себя? А потом эту вьюшку уже используем как один ээ...объект. Я правильно перефразировал действие инфлэйт?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 сен 2012, 15:18 

Зарегистрирован: 14 май 2012, 17:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Layout xml - файл это рецепт (описание объектов и их свойств), а LayoutInflater "готовит" (создает) объекты по этому рецепту.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 сен 2012, 18:20 
Аватар пользователя

Зарегистрирован: 20 июл 2012, 12:31
Сообщений: 506
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
А как это из сервиса реализовать...на getLayoutInflater() говорит, the method getLayoutInflater() is undefined for the type MyService


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 сен 2012, 17:15 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1319
Благодарил (а): 0 раз.
Поблагодарили: 69 раз.
powercat писал(а):
А как это из сервиса реализовать...на getLayoutInflater() говорит, the method getLayoutInflater() is undefined for the type MyService

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. LayoutInflater inflater = (LayoutInflater)getSystemService (Context.LAYOUT_INFLATER_SERVICE);

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 сен 2012, 17:20 
Аватар пользователя

Зарегистрирован: 20 июл 2012, 12:31
Сообщений: 506
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Ок, буду пробовать


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2012, 11:22 

Зарегистрирован: 09 авг 2012, 21:58
Сообщений: 33
Откуда: Краснодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Объясните пожалуйста, что такое android.R.layout.simple_expandable_list_item_1 для чего он и как он создается??? спасибо . и что такое конструктор ? на примере.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2012, 16:47 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 14:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
android.R.layout.simple_expandable_list_item_1 - это дефолтная разметка, можете указать свою (что желательно и делать)
что такое конструктор? - начните знакомство с ООП, а то будет трудно дальше. Пример:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. class MyClass {
  2.     MyClass() {} //это конструктор
  3. }

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 окт 2012, 04:04 
Аватар пользователя

Зарегистрирован: 04 сен 2012, 22:15
Сообщений: 35
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
добрый день ... может чучуть не по теме ... я делаю щас приложение ... и столкнулся с проблемой ...
у меня есть 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 до добавления виева на экран ... ???


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 окт 2012, 06:27 
Аватар пользователя

Зарегистрирован: 04 сен 2012, 22:15
Сообщений: 35
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
или не париться и оставить всё в одном xml как изначально и задумал ...
просто сейчас при запуске приложения высвечивается белый экран и думает секунд 5 ...
я так понимаю обрабатывая все view ... просто разделение этих виевов на файлы и подгрузка когда только нужно будет я считаю будет некой оптимизацией ...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 окт 2012, 10:36 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 14:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
Это велосипед. Я понимаю когда там для адаптеров нужны лейауты то создаются они конечно отдельно, но что бы приложение висло из-за того что много вьюшек первый раз слышу. Это же на сколько их много должно быть то? Скорее всего просто не оптимизирован сам код, а не лейауты. Бросайте код и посмотрим что бы убедиться.

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 окт 2012, 11:46 
Аватар пользователя

Зарегистрирован: 04 сен 2012, 22:15
Сообщений: 35
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
больше чем 276 элементов ....
я в логи выводил что программа делает ... и она именно на сетконтентвиев подвисает в начале на 3-5 сек ...
вот поэтому и решил переместить по файлам ...
у меня программа конвертор едениц измерения ... и для каждой системы: время длина мощность и тд ... свой набор textview и edittext ... вот я и решил что для каждой величины былобы разумно перемести по файлам и подгружать только при выборе перевода именно в эту величину ....


Последний раз редактировалось caHek2x 04 окт 2012, 11:52, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 окт 2012, 11:51 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 14:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
а ну тогда разумно сделать например какой то спинер или радиобаттон при выборе которых подгружается в активити необходимый лейаут.

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 50 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 4 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB