LayoutInflater 类的使用

转  http://yxwang0615.iteye.com/blog/1711147

 

一个Activity里如果直接用findViewById(),对应的是setConentView()的那个layout里的组件,因此如果你的

Activity里如果用到别的layout,你就必须用inflate()先将对话框上的layout找出来,然后再用这个layout对

象去找到它上面的组件,

 

 

 

Java代码 复制代码 收藏代码
  1. public View inflate(Context context, int Resourece,ViewGroup root)
  2. 作用:填充一个新的视图层次结构从指定的XML资源文件中
  3. context : The Context object for your activity or application
  4. reSource:View的layout的ID
  5. root: 生成的层次结构的根视图
  6. return 填充的层次结构的根视图。如果参数root提供了,那么root就是根视图;否则填充的XML文件的根就是根视图。
public View inflate(Context context, int Resourece,ViewGroup root)
  作用:填充一个新的视图层次结构从指定的XML资源文件中
  context : The Context object for your activity or application
  reSource:View的layout的ID
  root: 生成的层次结构的根视图
  return 填充的层次结构的根视图。如果参数root提供了,那么root就是根视图;否则填充的XML文件的根就是根视图。

 

 

View view = View.inflate(this, R.layout.dialog_layout, null);

TextView dialogTV = (TextView) view.findViewById(R.id.dialog_tv);

dialogTV.setText("abcd");

 

setContentView()一旦调用, layout就会立刻显示UI;而inflate只会把Layout形成一个以view类实现成的对象,

 

 

有需要时再用setContentView(view)显示出来。一般在activity中通过setContentView()将界面显示出来,

然后才能使用findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)

但是如果在非activity中如何对控件布局设置操作了,这就需要LayoutInflater动态加载。

LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化。

 

 

 

Java代码 复制代码 收藏代码
  1. LayoutInflater inflater = LayoutInflater.from(this);
  2. View view=inflater.inflate(R.layout.ID, null);
  3. //或者干脆并成一句:
  4. View view=LayoutInflater.from(this).inflate(R.layout.ID, null);
LayoutInflater inflater = LayoutInflater.from(this);     
View view=inflater.inflate(R.layout.ID, null);    
//或者干脆并成一句:    
View view=LayoutInflater.from(this).inflate(R.layout.ID, null); 

 

或者:

 

 

Java代码 复制代码 收藏代码
  1. LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
  2. View view=inflater.inflate(R.layout.ID, null);
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);    
View view=inflater.inflate(R.layout.ID, null); 

 


android.view.View类中也有一个inflater方法:

 

 

Java代码 复制代码 收藏代码
  1. public static View inflate (Context context, int resource, ViewGroup root)
  2. Inflate a view from an XML resource. This convenience method wraps the LayoutInflater class, which provides a full range of options for view inflation.
  3. Parameters
  4. context The Context object for your activity or application.
  5. resource The resource ID to inflate
  6. root A view group that will be the parent. Used to properly inflate the layout_* parameters.
public static View inflate (Context context, int resource, ViewGroup root)


Inflate a view from an XML resource. This convenience method wraps the LayoutInflater class, which provides a full range of options for view inflation.
Parameters

context	The Context object for your activity or application.
resource	The resource ID to inflate
root	A view group that will be the parent. Used to properly inflate the layout_* parameters.

该方法和LayoutInflater中的inflater方法区别不明,查api也没看明白:

 

 

Java代码 复制代码 收藏代码
  1. public View inflate (int resource, ViewGroup root)
  2. Inflate a new view hierarchy from the specified xml resource. Throws InflateException if there is an error.
  3. Parameters
  4. resource ID for an XML layout resource to load (e.g., R.layout.main_page)
  5. root Optional view to be the parent of the generated hierarchy.
  6. Returns
  7. The root View of the inflated hierarchy. If root was supplied, this is the root View; otherwise it is the root of the inflated XML file.
public View inflate (int resource, ViewGroup root)
Inflate a new view hierarchy from the specified xml resource. Throws InflateException if there is an error.

Parameters

resource	ID for an XML layout resource to load (e.g., R.layout.main_page)
root	Optional view to be the parent of the generated hierarchy.

Returns
The root View of the inflated hierarchy. If root was supplied, this is the root View; otherwise it is the root of the inflated XML file.

一般在adapter的getview方法中使用View.inflate的比较多,最近在研究自定义下拉刷新listview的时候,使用了View.inflate一直报如下错误:

 

 

Java代码 复制代码 收藏代码
  1. mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  2. shView = (RelativeLayout) mInflater.inflate(R.layout.pull_to_refresh_header, this, false);
  3. //mRefreshView = (RelativeLayout)View.inflate(context, R.layout.pull_to_refresh_header, null);
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		mRefreshView = (RelativeLayout) mInflater.inflate(R.layout.pull_to_refresh_header, this, false);
        //mRefreshView = (RelativeLayout)View.inflate(context, R.layout.pull_to_refresh_header, null);

 

 

Xml代码 复制代码 收藏代码
  1. android.view.InflateException: Binary XML file line #10: Error inflating class com.markupartist.android.widget.PullToRefreshListView
android.view.InflateException: Binary XML file line #10: Error inflating class com.markupartist.android.widget.PullToRefreshListView

而使用 LayoutInflater 就没事,原因翻阅很多资料都没弄明白,看样子定义控件的inflate还是使用

LayoutInflater 吧!

posted @ 2015-01-28 19:47  wikiki  阅读(216)  评论(0编辑  收藏  举报