Какова главная цель таких методов , как setTag()
и getTag()
из View
объектов типа?
Правильно ли я считаю, что могу связать любое количество объектов с одним представлением?
Какова главная цель таких методов , как setTag()
и getTag()
из View
объектов типа?
Правильно ли я считаю, что могу связать любое количество объектов с одним представлением?
Допустим, вы генерируете кучу просмотров, которые похожи. Вы можете установить OnClickListener
для каждого представления индивидуально:
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
...
Затем вы должны создать уникальный onClick
метод для каждого представления, даже если они делают схожие вещи, например:
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
Это связано с тем, что он onClick
имеет только один параметр a View
и должен получать другую информацию из переменных экземпляра или конечных локальных переменных во вложенных областях. Что мы действительно хотим, так это получить информацию от самих мнений .
Введите getTag
/ setTag
:
button1.setTag(1);
button2.setTag(2);
Теперь мы можем использовать один и тот же OnClickListener для каждой кнопки:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
Это в основном способ для представлений иметь воспоминания .
public void ui_click(View view){ if(20==((int)view.getTag())) view.setBackgroundColor(colorInt); }
должен сделать трюк для цветной части. 20 - это просто заполнитель для проверяющей позиции вашего просмотра.Я хотел бы добавить несколько слов.
Хотя использование,
get/setTag(Object)
кажется, очень полезно в конкретном случае шаблона ViewHolder, я рекомендую дважды подумать, прежде чем использовать его в других случаях. Почти всегда есть другое решение с лучшим дизайном.Основная причина в том, что подобный код довольно быстро перестает работать.
Для других разработчиков не очевидно, что вы разработали для хранения в качестве тега в представлении. Методы
setTag/getTag
не являются описательными вообще.Он просто хранит объект
Object
, который требуется разыграть, когда вы этого хотитеgetTag
. Вы можете получить неожиданные сбои позже, когда решите изменить тип хранимого объекта в теге.Вот реальная история: у нас был довольно большой проект с множеством адаптеров, асинхронными операциями с представлениями и так далее. Один разработчик решил
set/getTag
в своей части кода, но другой уже установил тег для этого представления. В конце концов, кто-то не смог найти свой собственный тег и был очень смущен. Чтобы найти ошибку, нам понадобилось несколько часов.setTag(int key, Object tag)
выглядит намного лучше, потому что вы можете генерировать уникальные ключи для каждого тега (используя ресурсы id ), но есть существенное ограничение для Android <4.0. Из документов Lint:источник
Мы можем использовать
setTag()
иgetTag()
для установки и получения пользовательских объектов в соответствии с нашим требованием.setTag()
Метод принимает аргумент типаObject
, иgetTag()
возвращаетObject
.Например,
источник
Для веб-разработчиков это, кажется, эквивалентно данным ...
источник
Это очень полезно для пользовательского
ArrayAdapter
использования. Это какая-то оптимизация. ТамsetTag
используется как ссылка на объект, который ссылается на некоторые части макета (которые отображаются вListView
) вместоfindViewById
.источник
Ссылка: http://developer.android.com/reference/android/view/View.html
источник
Установка тегов действительно полезна, когда у вас есть ListView и вы хотите перерабатывать / повторно использовать представления. Таким образом, ListView становится очень похожим на более новый RecyclerView.
источник