码迷,mamicode.com
首页 > 其他好文 > 详细

SetContentView与inflate区别

时间:2015-08-28 12:28:00      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

一般用LayoutInflater做一件事:inflate

inflate
这个方法总共有四种形式(见下面),目的都是把xml表述的layout转化为View对象。
其中有一个比较常用,View inflate(int resource, ViewGroup root),另三个,其实目的和这个差不多。

int resource
,也就是resource/layout文件在R文件中对应的ID,这个必须指定。
ViewGroup root则可以是nullnull时就只创建一个resource对应的View,不是null时,会将创建的view自动加为rootchild

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="
按钮"
/>
在程序中动态加载以上布局。
LayoutInflater flater = LayoutInflater.from(this);
View view = 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. This class is used to instantiate layout xml files into its corresponding view object. It is never be used directly——use getLayoutInflater() or getSystemService(String)getLayoutInflate() or getSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up that is already hook up to the current context and correct configured for the device you are running on.?
1
Context.public abstract object getSystemService(String name)?
2
两种获得LayoutInflater的方法?
a.
通过SystemService获得?
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLEATER_SERVICE);?
b.
从给定的context中获取?
Public static LayoutInflater from(Context context)?
c.
两者的区别:实际上是一样的,源码?
/**?
? ???* Obtains the LayoutInflater from the given context.?
? ???*/?
? ? public static LayoutInflater from(Context context) {?
? ?? ???LayoutInflater LayoutInflater =?
? ?? ?? ?? ?? ? (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);?
? ?? ???if (LayoutInflater == null) {?
? ?? ?? ?? ?throw new AssertionError("LayoutInflater not found.");?
? ?? ???}?
? ?? ???return LayoutInflater;?
}?
3
LayoutInflater.inflate()Layout文件转换为View,专门供Layout使用的Inflater。虽然Layout也是View的子类,但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过findViewById()?
4
LinearLayout linearLayout =?
(LinearLayout) findViewById(R.id.placeslist_linearlayout);?
linearLayout.addView(place_type_text);?
5
findViewById有两种形式?
R.layout.xx
是引用res/layout/xx.xml的布局文件(inflate 方法)R.id.xx是引用布局文件里面的组件,组件的idxxfindViewById方法)。所有的组件id都能用R.id.xx来查看,但是组件不在setContentView()里面的layout中就无法使用,Activity.findViewById()会出现空指针异常?
a. activity
中的findViewById(int id)?
b. View
中的findViewById(int id)?
6.
不同点是LayoutInflater是用来找layoutxml布局文件,并且实例化!而findViewById()是找具体xml下的具体 widget控件(:Button,TextView)

SetContentView与inflate区别

标签:

原文地址:http://www.cnblogs.com/haldir/p/4765860.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!