Android开发中setContentView和inflate的区别分析
本文实例讲述了Android开发中setContentView和inflate的区别。分享给大家供大家参考,具体如下:
一般用LayoutInflater做一件事:inflate
inflate这个方法总共有四种形式(见下面),目的都是把xml表述的layout转化为View对象。
其中有一个比较常用,Viewinflate(intresource,ViewGrouproot),另三个,其实目的和这个差不多。
intresource,也就是resource/layout文件在R文件中对应的ID,这个必须指定。
而ViewGrouproot则可以是null,null时就只创建一个resource对应的View,不是null时,会将创建的view自动加为root的child。
setContentView和inflate区别:
setContentView()一旦调用,layout就会立刻显示UI;而inflate只会把Layout形成一个以view类实现成的对象,有需要时再用setContentView(view)显示出来
一般在activity中通过setContentView()将界面显示出来,但是如果在非activity中如何对控件布局设置操作了,这需LayoutInflater动态加载
<TextView android:id="@+id/tview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="ATAAW.COM" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/button" android:text="按钮" />
在程序中动态加载以上布局。
LayoutInflaterflater=LayoutInflater.from(this); Viewview=flater.inflate(R.layout.example,null);
获取布局中的控件。
button=(Button)view.findViewById(R.id.button); textView=(TextView)view.findViewById(R.id.tview);
接下来结合源码说说inflate方法的四种形式:
inflate方法总共有四种形式,把xml表达的layout转化为view.Thisclassisusedtoinstantiatelayoutxmlfilesintoitscorrespondingviewobject.Itisneverbeuseddirectly——usegetLayoutInflater()orgetSystemService(String)getLayoutInflate()orgetSystemService(String)toretrieveastandardLayoutInflaterinstancethatisalreadyhookedupthatisalreadyhookuptothecurrentcontextandcorrectconfiguredforthedeviceyouarerunningon.
1.Context.publicabstractobjectgetSystemService(Stringname)
2.两种获得LayoutInflater的方法
a.通过SystemService获得
LayoutInflaterinflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLEATER_SERVICE);
b.从给定的context中获取
PublicstaticLayoutInflaterfrom(Contextcontext)
c.两者的区别:实际上是一样的,源码
/** *ObtainstheLayoutInflaterfromthegivencontext. */ publicstaticLayoutInflaterfrom(Contextcontext){ LayoutInflaterLayoutInflater= (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(LayoutInflater==null){ thrownewAssertionError("LayoutInflaternotfound."); } returnLayoutInflater; }
3.LayoutInflater.inflate()将Layout文件转换为View,专门供Layout使用的Inflater。虽然Layout也是View的子类,但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过findViewById()。
4.
LinearLayoutlinearLayout= (LinearLayout)findViewById(R.id.placeslist_linearlayout); linearLayout.addView(place_type_text);
5.findViewById有两种形式
R.layout.xx是引用res/layout/xx.xml的布局文件(inflate方法),R.id.xx是引用布局文件里面的组件,组件的id是xx(findViewById方法)。所有的组件id都能用R.id.xx来查看,但是组件不在setContentView()里面的layout中就无法使用,Activity.findViewById()会出现空指针异常
a.activity中的findViewById(intid)
b.View中的findViewById(intid)
6.不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化!而findViewById()是找具体xml下的具体widget控件(如:Button,TextView等)
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android编程之activity操作技巧总结》、《Android视图View技巧总结》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android文件操作技巧汇总》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。