view.findViewById 和Activity.findViewById区别

view.findViewById 和Activity.findViewById区别

292人阅读 评论(0) 收藏 举报
本文章已收录于:
两个类中都有findViewById()方法,Activity中的findViewById最终是调用View中的findViewById方法,这个可以从源码看出来:
  1. public View findViewById(int id) {  
  2.         return getWindow().findViewById(id);//activity中的方法  
  3.     }  

Activity是先拿到window对象,之后再拿view对象:

  1. public View findViewById(int id) {  
  2.        return getDecorView().findViewById(id); // window中的方法  
  3.    }  

最后才是调用View中的方法:

  1. public final View findViewById(int id) {  
  2.         if (id < 0) {  
  3.             return null;  
  4.         }  
  5.         return findViewTraversal(id);         //View中的方法  
  6.     }  

所以,如果在Activity中调用findViewById(int id)的时候,要注意id的来源,如果id不是在当前Activity所在的窗口,拿到的view对象就为空,比如:
  1. @Override  
  2.     protected void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.activity_main);  
  5.           
  6.         View contentView = getLayoutInflater().inflate(R.layout.popup, null);  
  7.         final PopupWindow popup = new PopupWindow(contentView, 280360);  
  8.           
  9.         Button button = (Button) findViewById(R.id.bn);  
  10.         button.setOnClickListener(new OnClickListener() {  
  11.             @Override  
  12.             public void onClick(View v) {  
  13.                 popup.showAsDropDown(v);  
  14.             }  
  15.         });  
  16.           
  17.         Button button2 = (Button) findViewById(R.id.close);  
  18.         button2.setOnClickListener(new OnClickListener() {  
  19.               
  20.             @Override  
  21.             public void onClick(View v) {  
  22.                 popup.dismiss();  
  23.             }  
  24.         });  
  25.           
  26.     }  
上面的R.id.close不是在activity_main.xml里面,而是在popup.xml里面(布局文件略),所以拿到的button2为null,要真想拿到button2对象,不能直接调用activity的findViewById()方法,而是调用view的findViewById()方法,改为这样就可以了:
  1. Button button2 = (Button) contentView.findViewById(R.id.close);  
  2.         button2.setOnClickListener(new OnClickListener() {  
  3.               
  4.             @Override  
  5.             public void onClick(View v) {  
  6.                 popup.dismiss();  
  7.             }  
  8.         }); 



转载:http://blog.csdn.NET/breezylee2009/article/details/38580991

1
0
 
 
我的同类文章
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值