Android LayoutInflater.inflate使用上的问题解惑
2015-05-31 16:46
465 查看
最近在在使用LayoutInflater.inflate方法时遇到了一些问题,以前没有仔细看过此类的使用方法,故将其记录下来,方便日后查阅。
相信大家都知道LayoutInflater.inflate是在android开发遇到的一些使用频率是非常高的方法,如果使用不好的,就会出现一些奇怪的问题。
一个例子如下:
1,一个主布局文件如下
调用
如果
因此,最好还是使用这个代码吧:
相信大家都知道LayoutInflater.inflate是在android开发遇到的一些使用频率是非常高的方法,如果使用不好的,就会出现一些奇怪的问题。
一个例子如下:
1,一个主布局文件如下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </RelativeLayout> 上述的布局文件非常简单,只是在Relative文件中添加了一个ListView. 2,ListView的子View item的布局文件如下
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="100dp" android:orientation="vertical" android:background="@android:color/holo_red_dark"> <TextView android:id="@+id/list_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center" android:textSize="20dp" android:textColor="@android:color/black"/> </LinearLayout>
生成的预览图如下: 为了明显起见,此处将背景设为红色。 3,设置ListView的adapter,adapter的getView方法如下: public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){ convertView = mInflater.inflate(R.layout.list_item,null); } TextView textView = (TextView)convertView.findViewById(R.id.list_item); textView.setText(position + ""); return convertView; } 最终的样式如下:
可以从测试结果中明显的看出,list_item.xml中设置的高度没有生效,很有可能是ListView的adapter中getView方法中
mInflater.inflate(R.layout.list_item,null),这里的问题。 于是改成 mInflater.inflate(R.layout.list_item,parent,false),再次运行结果如下: 上述正是我们想要的结果,下面就针对上述问题结合源码分析下LayoutInflater.inflate方法的使用. 可能有不少的人都不知道LayoutInflater.inflate还有第三个参数,此方法的参数如下:
public View inflate(int resource, ViewGroup root, boolean attachToRoot). 从源码可以得知,不管是 public View inflate(int resource, ViewGroup root)还是
public View inflate(int resource, ViewGroup root, boolean attachToRoot),最终都是调用了
public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)。 上述我们例子中调用了
public View inflate(int resource, ViewGroup root),让我们看下此方法的代码如下: public View inflate(int resource, ViewGroup root) {
return inflate(resource, root, root != null); }
public View inflate(int resource, ViewGroup root, boolean attachToRoot) { if (DEBUG) System.out.println("INFLATING from resource: " + resource); XmlResourceParser parser = getContext().getResources().getLayout(resource); try { return inflate(parser, root, attachToRoot); } finally { parser.close(); } } 可以发现不管是 public View inflate(int resource, ViewGroup root)还是
public View inflate(int resource, ViewGroup root, boolean attachToRoot),最终都是调用了
public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)。 上述例子中调用inflate(R.layout.list_item,null),从上述源码中可以看出最终传给
inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)方法的参数转变为
inflate(XmlPullParser parser,null,false); 下面重点针对
public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)方法进行分析,下面只列出了其核心部分的代码 在471行可以看到,当root ! = null时,通过root产生子 view的LayoutParams,此时如果attachToRoot为true,则将此子View 添加进root view,并返回root view; 如果attachToRoot为false则直接返回parser解析的view; 如果root == null,此时直接返回parser解析出来的view,并未设置此view的LayoutParams,此view的LayoutParams将会在被添加时由Parent View赋予值,这就是上述例子第一次的写法没有生效的原因。 针对以上的分析,归纳如下:
调用
LayoutInflater.inflate方法,并且将root参数设置为
null,就等于忽略了xml布局文件中的
layout_×参数
如果
root不为
null,并且
attachRoot=true,那么就会根据
root生成一个布局文
件View的
LayoutParam对象,并且将这个
View添加到
root中去,并且返回这个
root的
View
因此,最好还是使用这个代码吧:
View v1 = LayoutInflater.from(this).inflate(R.layout.layout_menu_item, layout, false);
相关文章推荐
- Application Error - The connection to the server was unsuccessful. (file:///android_asset/www/index.html)
- 获取数据源数据的实现---Architecting Android
- Android应用层View绘制流程与源码分析
- 编译android指定模块
- android 推送选择
- Android 继承DialogFragment弹出dialog对话框
- Android开发--Facebook酷炫开源库Shimmer使用
- Android开发相关的Blog推荐——跟随大神的脚步才能成长为大神
- android开发环境搭建
- android自定义View实现图片上传进度显示(仿手机QQ上传效果)
- Android Manifest内容解析
- Android Manifest内容解析
- Android View 之进度条+拖动条+星级评论条....
- Mac 下配置Android NDK 环境变量[附带网盘NDK下载]
- openCv4Android之fitLine中各算法总结
- Android资源收集:
- Android组件:Fragment切换后保存状态
- Android 开发环境更新方法
- Android JNI编程学习
- Android ListView 图片异步加载和图片内存缓存