Какова основная цель методов setTag() getTag() View?

Какова основная цель таких методов, как setTag() и getTag() объектов типа View?

Я правильно понимаю, что я могу связать любое количество объектов с одним представлением?

Ответ 1

Скажем, вы создаете кучу взглядов, которые похожи. Вы можете установить 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 имеет только один параметр, View, и ему нужно получить другую информацию из переменных экземпляра или конечных локальных переменных в охватывающих областях. Мы действительно хотим получить информацию из самих представлений.

Введите getTag/setTag:

button1.setTag(1);
button2.setTag(2);

Теперь мы можем использовать один и тот же OnClickListener для каждой кнопки:

listener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        doAction(v.getTag());
    }
};

Это в основном способ просмотра воспоминаний.

Ответ 2

Я хотел бы добавить несколько слов.

Хотя использование get/setTag(Object) представляется очень полезным в конкретном случае шаблона ViewHolder, я бы рекомендовал дважды подумать, прежде чем использовать его в других случаях. Почти всегда есть еще одно хорошее дизайнерское решение.

Основная причина заключается в том, что код становится неприемлемым довольно быстро.

  • Для других разработчиков не очевидно, что вы планировали хранить в виде тега. Методы setTag/getTag не являются описательными вообще.

  • В нем хранится только Object, поэтому для его использования требуется getTag. Позднее вы можете получить неожиданный сбой, когда вы решите изменить тип хранимого объекта в теге.

  • Это история из реальной жизни. У нас был довольно большой проект с множеством адаптеров, асинхронными операциями с представлениями и т.д. Один разработчик решил set/getTag в своей части кода, но другой уже установил тег для этого представления. В конце концов, кто-то не смог найти свой тег и был очень смущен. Это стоило нам нескольких часов, чтобы найти ошибку.

setTag(int key, Object tag) выглядит намного лучше, потому что вы можете создавать уникальные ключи для каждого тега (используя ресурсы id), но есть значительное ограничение для Android < 4.0. Из документов Lint:

До Android 4.0 реализация View.setTag(int, Object) будет хранить объекты в статической карте, где значения были сильно ссылки. Это означает, что если объект содержит ссылки, ссылающиеся на контекст, контекст (который указывает на почти все остальное) просочится. Если вы передадите представление, представление дает ссылку на контекст, который его создал. Аналогично, просмотр держатели обычно содержат представление, а курсоры иногда также связанных с представлениями.

Ответ 3

Мы можем использовать setTag() и getTag() для установки и получения пользовательских объектов в соответствии с нашим требованием. Метод setTag() принимает аргумент типа Object, а getTag() возвращает Object.

Например,

Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);

Ответ 4

Для веб-разработчиков это похоже на данные -..

Ответ 5

Это очень полезно для использования ArrayAdapter. Это своего рода оптимизация. Там setTag используется как ссылка на объект, который ссылается на некоторые части макета (который отображается в ListView) вместо findViewById.

static class ViewHolder {
    TextView tvPost;
    TextView tvDate;
    ImageView thumb;
}

public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        LayoutInflater inflater = myContext.getLayoutInflater();
        convertView = inflater.inflate(R.layout.postitem, null);

        ViewHolder vh = new ViewHolder();
        vh.tvPost = (TextView)convertView.findViewById(R.id.postTitleLabel);
        vh.tvDate = (TextView)convertView.findViewById(R.id.postDateLabel);
        vh.thumb = (ImageView)convertView.findViewById(R.id.postThumb);
        convertView.setTag(vh);
    }
            ....................
}

Ответ 6

В отличие от идентификаторов, теги не используются для идентификации видов. Теги - это, по сути, дополнительная информация, которая может быть связана с представлением. Они чаще всего используются в качестве удобства для хранения данных, связанных с представлениями в самих представлениях, а не путем размещения их в отдельной структуре.

Ссылка: http://developer.android.com/reference/android/view/View.html

Ответ 7

Настройка TAG действительно полезна, когда у вас есть ListView и вы хотите повторно использовать/повторно использовать представления. Таким образом ListView становится очень похожим на новый RecyclerView.

@Override
public View getView(int position, View convertView, ViewGroup parent)
  {
ViewHolder holder = null;

if ( convertView == null )
{
    /* There is no view at this position, we create a new one. 
       In this case by inflating an xml layout */
    convertView = mInflater.inflate(R.layout.listview_item, null);  
    holder = new ViewHolder();
    holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk );
    convertView.setTag (holder);
}
else
{
    /* We recycle a View that already exists */
    holder = (ViewHolder) convertView.getTag ();
}

// Once we have a reference to the View we are returning, we set its values.

// Here is where you should set the ToggleButton value for this item!!!

holder.toggleOk.setChecked( mToggles.get( position ) );

return convertView;
}

Ответ 8

Код был добавлен, и изображение было добавлено в базу данных Я не мог запросить его или показать его из базы данных Вы можете помочь. Спасибо вам

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    open_btn = (Button) findViewById(R.id.open);
    save_btn = (Button) findViewById(R.id.save);
    open_Img = (ImageView) findViewById(R.id.openImage);
    saveImg = (ImageView) findViewById(R.id.saveImage);

}

public void save(View view) {
    Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(i, 100);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 100 && resultCode == RESULT_OK) {

        Uri uri = data.getData();
        saveImg.setImageURI(uri);

        bitmap = ((BitmapDrawable)saveImg.getDrawable()).getBitmap();
        byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream);
        encodeImage = Base64.encodeToString(byteArrayOutputStream.toByteArray(),Base64.DEFAULT);
    }

}

public void open(View view) {

    byte[] bytes =Base64.decode(encodeImage,Base64.DEFAULT);
    Bitmap decodBitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
    open_Img.setImageBitmap(decodBitmap);


}

}