• View.inflate和LayoutInflater的inflate方法区别


    平时ListView加载item中,adapter的getView方法中,我们经常用到:

    LayoutInflater.from(mContext).inflate(R.layout.it
    ,parent,false);

    这样的方法来加载布局xml,平时一直就是这么用的,也没什么疑问。今天网上看了个自定义布局的源码,自定义布局中加载布局xml用的View.inflate方法:

    public class SettingItemView extends RelativeLayout {
    
        private CheckBox cb_status;
        private TextView tv_description;
        private TextView tv_title;
    
        private String desc_on;
        private String desc_off;
    
        private void iniView(Context context) {
            View.inflate(context, R.layout.setting_item_view, this);//第三个参数传布局文件的父类
            cb_status=(CheckBox) this.findViewById(R.id.cb_status);
            tv_description=(TextView) this.findViewById(R.id.tv_description);
            tv_title=(TextView) this.findViewById(R.id.tv_title);
        }

    第一次见用这种方式来加载布局的,看了下他的listview加载item,也是用这种方式:

    @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                View view;
                ViewHolder holder;
                if(convertView==null){
                    view=View.inflate(getApplicationContext(), R.layout.list_item_callsms, null);//最后一个传了null
                    holder=new ViewHolder();
                    holder.tv_number=(TextView) view.findViewById(R.id.tv_black_number);
                    holder.tv_mode=(TextView) view.findViewById(R.id.tv_black_mode);
                    holder.iv_delete=(ImageView) view.findViewById(R.id.iv_delete);
                    view.setTag(holder);

    好吧,看一下View.inflate的说明:
    Open Declaration View android.view.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.
    See Also: LayoutInflater
    最后有一句让你看LayoutInflater这个类,怀疑它内部也是用LayoutInflater实现的,进入源码:

     public static View inflate(Context context, int resource, ViewGroup root) {
            LayoutInflater factory = LayoutInflater.from(context);
            return factory.inflate(resource, root);
        }

    果然内部也是用LayoutInflater实现的,不知道为啥android还要用View.inflat封装一下。。。o(〃’▽’〃)o
    其中LayoutInflater的Inflate的三个参数意思为:

    对于Inflate的三个参数(int resource, ViewGroup root, boolean attachToRoot)

    如果inflate(layoutId, null )则layoutId的最外层的控件的宽高是没有效果的

    如果inflate(layoutId, root, false ) 则认为和上面效果是一样的

    如果inflate(layoutId, root, true ) 则认为这样的话layoutId的最外层控件的宽高才能正常显示

    对这三个参数区别不理解的话可以看这篇文章:
    inflate第三个参数意思

    从源码角度解析的有郭大神的:
    Android LayoutInflater原理分析,带你一步步深入了解View(一)
    以及另一篇感觉很不错的:
    Android LayoutInflate深度解析 给你带来全新的认识

    看完,你应该知道这个参数意思了,ok,再来看上面代码, 这时就可以替换为layoutInflater的方式了:

    对于第一个自定义布局:

    //View.inflate(context, R.layout.setting_item_view, this);//第三个参数传布局文件的父类
            LayoutInflater.from(context).inflate(R.layout.setting_item_view, this, true);//等价于上面

    第二个适配器中getView:

    //view=View.inflate(getApplicationContext(), R.layout.list_item_callsms, null);
                    view=LayoutInflater.from(getApplicationContext()).inflate(R.layout.list_item_callsms,parent,false);
  • 相关阅读:
    spark 随意笔记
    c#读取输入字符串,从数据源中查找以该字符串开头的所有字符串(使用正则表达式)
    我的收藏链接地址
    SQL查询时,遇到用到关键词作的字段。将该字段用一对中括号括起来[]
    SQL数据类型相互转换
    Javascript获取系统当前时间
    节点类型nodeType的取值
    混合布局编程挑战
    Webstorm破解方法
    二列布局
  • 原文地址:https://www.cnblogs.com/ldq2016/p/6244780.html
Copyright © 2020-2023  润新知