原文地址:http://www.cnblogs.com/qingblog/archive/2012/07/03/2575140.html

View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来。

可以用在多个Button添加一个监听器,每个Button都设置不同的setTag。这个监听器就通过getTag来分辨是哪个Button 被按下。

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.widget.Button;
  5. public class Main extends Activity {
  6. @Override
  7. public void onCreate(Bundle savedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. Button button1 = (Button) findViewById(R.id.Button01);
  11. Button button2 = (Button) findViewById(R.id.Button02);
  12. Button button3 = (Button) findViewById(R.id.Button03);
  13. Button button4 = (Button) findViewById(R.id.Button04);
  14. MyListener listener = new MyListener();
  15. button1.setTag(1);
  16. button1.setOnClickListener(listener);
  17. button2.setTag(2);
  18. button2.setOnClickListener(listener);
  19. button3.setTag(3);
  20. button3.setOnClickListener(listener);
  21. button4.setTag(4);
  22. button4.setOnClickListener(listener);
  23. }
  24. public class MyListener implements View.OnClickListener {
  25. @Override
  26. public void onClick(View v) {
  27. int tag = (Integer) v.getTag();
  28. switch (tag){
  29. case 1:
  30. System.out.println("button1 click");
  31. break;
  32. case 2:
  33. System.out.println("button2 click");
  34. break;
  35. case 3:
  36. System.out.println("button3 click");
  37. break;
  38. case 4:
  39. System.out.println("button4 click");
  40. break;
  41. }
  42. }
  43. }
  44. }
  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.widget.Button;
  5. public class Main extends Activity {
  6. @Override
  7. public void onCreate(Bundle savedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. Button button1 = (Button) findViewById(R.id.Button01);
  11. Button button2 = (Button) findViewById(R.id.Button02);
  12. Button button3 = (Button) findViewById(R.id.Button03);
  13. Button button4 = (Button) findViewById(R.id.Button04);
  14. MyListener listener = new MyListener();
  15. button1.setTag(1);
  16. button1.setOnClickListener(listener);
  17. button2.setTag(2);
  18. button2.setOnClickListener(listener);
  19. button3.setTag(3);
  20. button3.setOnClickListener(listener);
  21. button4.setTag(4);
  22. button4.setOnClickListener(listener);
  23. }
  24. public class MyListener implements View.OnClickListener {
  25. @Override
  26. public void onClick(View v) {
  27. int tag = (Integer) v.getTag();
  28. switch (tag){
  29. case 1:
  30. System.out.println("button1 click");
  31. break;
  32. case 2:
  33. System.out.println("button2 click");
  34. break;
  35. case 3:
  36. System.out.println("button3 click");
  37. break;
  38. case 4:
  39. System.out.println("button4 click");
  40. break;
  41. }
  42. }
  43. }
  44. }

在写listView 时候要重写BaseAdapter 
需要在每个item都加上button 点击button做相应操作 
这个时候需要button里面设置下 这行的属性button.setTag(item.user.name); 
然后处理button事件。 
这个东西在一些需要用到Adapter自定控件显示方式的时候非常有用 
Adapter 有个getView方法,可以使用setTag把查找的view缓存起来方便多次重用 

  1. public View getView(int position, View convertView, ViewGroup parent) {
  2. ViewHolder vh;
  3. if (convertView == null){
  4. LayoutInflater inflater = (LayoutInflater) mWidgetsSwitchApp .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  5. convertView = inflater.inflate(R.layout.app_gallery_item, null);
  6. vh = new ViewHolder();
  7. vh.view1 = (ImageView) convertView.findViewById(R.id.view1);
  8. vh.view2 = (ImageView) convertView.findViewById(R.id.view2);
  9. vh.view3= (ImageView) convertView.findViewById(R.id.view3);
  10. vh.view4 = (ImageView) convertView.findViewById(R.id.view4);
  11. convertView.setTag(vh);
  12. }else{
  13. vh = (ViewHolder) convertView.getTag();
  14. }
  15. //其他的代码可以直接使用 vh.view1、vh.view2、vh.view3 、vh.view4
  16. }
  1. public View getView(int position, View convertView, ViewGroup parent) {
  2. ViewHolder vh;
  3. if (convertView == null){
  4. LayoutInflater inflater = (LayoutInflater) mWidgetsSwitchApp .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  5. convertView = inflater.inflate(R.layout.app_gallery_item, null);
  6. vh = new ViewHolder();
  7. vh.view1 = (ImageView) convertView.findViewById(R.id.view1);
  8. vh.view2 = (ImageView) convertView.findViewById(R.id.view2);
  9. vh.view3= (ImageView) convertView.findViewById(R.id.view3);
  10. vh.view4 = (ImageView) convertView.findViewById(R.id.view4);
  11. convertView.setTag(vh);
  12. }else{
  13. vh = (ViewHolder) convertView.getTag();
  14. }
  15. //其他的代码可以直接使用 vh.view1、vh.view2、vh.view3 、vh.view4
  16. }

你可以看看android的源码,特别有listview的,你就会发现这个函数很多时候有妙用!呵呵! 
我的一点理解是,绑定数据,特别是绑定数据到view。而且可以用getTag()取得,很方便,而且是任意类型的数据,真的很酷。 
在实例BaseAdapter()的getView(position, convertView, par)里有用到。convertView这里会用到setTag() getTag()。就可以生成convertView并复用里面的widget 
一直觉得这个东西没啥用setTag(),不过只要能用上 就是比较巧的了 
在一个程序中呢 我有好多个button 我想点击一个出现1 点击第二个出现2

  1. for (int i = 0; i < 20; i++) {
  2. cells[i] = (ImageView) findViewById(cellIDs[i]);
  3. cells[cellnumber++].setOnClickListener(new OnClickListener() {
  4. public void onClick(View v){
  5. cellClicked(cellnumber, v);
  6. }
  7. });
  8. }
  1. for (int i = 0; i < 20; i++) {
  2. cells[i] = (ImageView) findViewById(cellIDs[i]);
  3. cells[cellnumber++].setOnClickListener(new OnClickListener() {
  4. public void onClick(View v){
  5. cellClicked(cellnumber, v);
  6. }
  7. });
  8. }

上面的代码效率不高 而且 无论点击哪一个都会出现21 当然这是我逻辑错误那怎么实现呢

  1. OnClickListener listener = new OnClickListener() {
  2. public void onClick(View v){
  3. int cellId = (Integer) v.getTag(); cellClicked(cellId, v);
  4. }
  5. }
  6. View v;
  7. for (int i = 0; i < 20; i++){
  8. v = findViewById(cellIDs[i]);
  9. v.setOnClickListener(listener);
  10. v.setTag(i);
  11. }
  1. OnClickListener listener = new OnClickListener() {
  2. public void onClick(View v){
  3. int cellId = (Integer) v.getTag(); cellClicked(cellId, v);
  4. }
  5. }
  6. View v;
  7. for (int i = 0; i < 20; i++){
  8. v = findViewById(cellIDs[i]);
  9. v.setOnClickListener(listener);
  10. v.setTag(i);
  11. }

这样呢就实例话一个listener,同时通过tag传值就不是每一个实例都做了

view的setTag() 和 getTag()应用 (转)的更多相关文章

  1. View的setTag和getTag方法

    ---恢复内容开始--- public View getView(int position, View convertView, ViewGroup parent) { Msg msg =getIte ...

  2. View 的setTag() 和 getTag()

    View 的setTag() 和 getTag()ImageView.setTag(""); 就是当多个ImageView用到一个监听器时,能触发不同的情况,是View的方法 Ad ...

  3. View的setTag()与getTag()方法使用

    通常我们是用findViewById()方法来取得我们要使用的View控件,不过除了这一种方法之处 ,我们还可以用View中的setTag(Onbect)给View添加一个格外的数据,再用getTag ...

  4. android:View的setTag和getTag使用

    1.用于区分非常多类似的View 比如: button1.setOnClickListener(new OnClickListener ... ); button2.setOnClickListene ...

  5. View的setTag和getTag使用

    在listview 优化其中,会使用到setTag()以及getTag()方法 代码例如以下: @Override public View getView(int position, View con ...

  6. android:View的setTag和getTag

    Adapter 有个getView方法,可以使用setTag把查找的view缓存起来方便多次重用 public View getView(int position, View convertView, ...

  7. view的setTag() 和 getTag()应用 ViewHolder

    转自 http://www.cnblogs.com/qingblog/archive/2012/07/03/2575140.html View中的setTag(Onbect)表示给View添加一个格外 ...

  8. view中的setTag和getTag方法的理解

    下面是一段自定义适配器中的getView方法,其中使用了view的一个setTag和getTag方法 View中的setTag(Onbect)表示给View添加一个格外的数据(相当于缓存),以后可以用 ...

  9. Android setTag()与getTag(),与set多个setTag()

    首先我们要知道setTag方法是干什么的,SDK解释为 Tags Unlike IDs, tags are not used to identify views. Tags are essential ...

随机推荐

  1. Oracle 11g 下载|Oracle 11g 官网下载|Oracle 11g 官网下载 带登录用户和密码

    本文转载自 Oracle 11g 下载|Oracle 11g 官网下载|Oracle 11g 官网下载 带登录用户和密码 oracle 下载还需要用户名我自己注册了个方便大家使用下载直接点击提示找不到 ...

  2. Shell 读取文本内容

    在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法.为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率. ...

  3. Android webView解析URL参数

    2015年6月18日 13:56:21 星期四 又当爹又当娘啊............ public void onPageFinished(WebView view, String url) { s ...

  4. C# 反射+抽象工厂模式

    此模式可以很好的更换程序使用不同的数据库 1.用到的属性类 using System; using System.Collections.Generic; using System.Linq; usi ...

  5. nyoj_299_Matrix Power Series_矩阵快速幂

    Matrix Power Series 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 Given a n × n matrix A and a positive i ...

  6. Match:Seek the Name, Seek the Fame(POJ 2752)

    追名逐利 题目大意:给定一个字符串S,要你找到S的所有前缀后缀数组 还是Kmp的Next数组的简单应用,但是这一题有一个BUG,那就是必须输出字符串的长度(不输出就WA),然而事实上对于abcbab, ...

  7. MFC Initinstance中DoModal()返回-1

    新建一个基于对话框的MFC应用程序,在App的Initinstance中调用对话框DoModal()来显示对话框,这是框架的内容,应用程序框架生成的全部是正常的. 当把我对话框的资源文件提取到一个资源 ...

  8. linux下mysql开启关和重启

    开启: /etc/init.d/mysql start关闭: /etc/init.d/mysql stop重启: /etc/init.d/mysql restart 查看字符集show variabl ...

  9. 【leetcode】Next Permutation(middle)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  10. 用css解决iframe的自适应问题(跨域下同样有用)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...