我们调用的findViewById()函数其实有两种(目前我只看到两种,不确定还有没有其他的),一种是Activity类中findViewById()函数
另外一种是View类中定义的findViewById()函数
一般我们在oncreate()方法中使用的(**view)findViewById(R.id.**)既是调用的Activity中的findViewById()函数
而在其他情况写出的(**)view.findViewById()中调用的是view类中的findViewById()
综合多次经验:
一般的onCreate方法中会有setContentView(R.id.main)方法
如果有这个方法,则用findViewById方法;
如果无就用View.findViewById()方法;
setContentView就是设置一个Activity的显示界面,如果没有调用它,那么如何将layout中的布局/id拿出来用?仅仅用findViewById是不行的,因为没有“平台”,这个平台就是View。
现在,整体来看这一条语句:
Button button1 = (Button)itemView.findViewById(R.id.second);
Button button2 = (Button)findViewById(R.id.second);
可以把setContentView理解为创建一个平台,itemView理解为零时借用View这个平台。然后在这个平台上进行和layout组件中配对的操作。当然(Button)的作用就是为了在平台上找东西。
Android之Inflate()方法用途 调用findviewbyid出现 on a null object reference错误
Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能。
android上还有一个与Inflate()类似功能的方法叫findViewById(),二者有时均可使用,但也有区别
区别在于:
如果你的Activity里用到别的layout,比如对话框layout,你还要设置这个layout上的其他组件的内容,你就必须用inflate()方法先将对话框的layout找出来,然后再用findViewById()找到它上面的其它组件。例如:
[html] view plain copy
- View view1=View.inflate(this,R.layout.dialog_layout,null);
- TextViewdialogTV=(TextView)view1.findViewById(R.id.dialog_tv);
- dialogTV.setText("abcd");
注:R.id.dialog_tv是在对话框layout上的组件,而这时若直接用this.findViewById(R.id.dialog_tv)肯定会报错。
[html] view plain copy
- View viewStub = ((ViewStub) findViewById(R.id.stubView)).inflate();
Inflate()或可理解为“隐性膨胀”,隐性摆放在view里,inflate()前只是获得控件,但没有大小没有在View里占据空间,inflate()后有一定大小,只是出于隐藏状态