LayoutInflater你该知道的事

LayoutInflater的获取方式有两种:

LayoutInflater lif = LayoutInflater.from(Context context);
LayoutInflater lif = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    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;
    }
LayoutInflater.from(context)的源码可知,它就是对context.getSystemService()的一种安全封装,所以更建议使用LayoutInflater.from(context)的方式

LayoutInflater.inflate比较常用的2个重载方法:
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) {
        return inflate(resource, root, root != null);
    }

LayoutInflater.inflate(layoutId,rootView,attchToRoot)
layoutId 对应的布局文件;
rootView 对应的父容器;
attchToRoot 是否添加到rootView中。
inflate(resource,root)其实调用的也是infalte(resource,root,attachToRoot),第三个参数根据root是否为空自动赋值。

情形1:
mInflater.inflate(R.layout.view_textview, null),
mInflater.inflate(R.layout.view_textview, null, true),
mInflater.inflate(R.layout.view_textview, null, false),
这三种方式返回的都是对应布局中的tempView,不会设置layoutParams,也没有rootView可以添加;当前view的LayoutParams由添加它的ViewGroup决定。

情形2:
mInflater.inflate(R.layout.view_textview, parent),
mInflater.inflate(R.layout.view_textview, parent, true),
源码中有这样一段:
if (root != null && attachToRoot) {
    root.addView(temp, params);
}
这两种都是创建temp的View,params获取的是root的LayoutParams,然后执行root.addView(temp, params);最后返回root。
当root不为null,attachToRoot为true时,表示将resource指定的布局添加到root中,添加的过程中resource所指定的的布局的根节点的各个属性都是有效的。

情形3:
mInflater.inflate(R.layout.view_textview, parent, false),
源码中有这样一段:
        if (root != null) {
            if (DEBUG) {
                System.out.println("Creating params from root: " +
                        root);
            }
            // Create layout params that match root, if supplied
            params = root.generateLayoutParams(attrs);
            if (!attachToRoot) {
                // Set the layout params for temp if we are not
                // attaching. (If we are, we use addView, below)
                temp.setLayoutParams(params);
            }
        }
创建temp的View,然后执行temp.setLayoutParams(params);然后再返回temp。
如果root不为null,而attachToRoot为false的话,表示不将第一个参数所指定的View添加到root中,那么这个时候有的小伙伴可能就有疑问了,既然不添加到root中,那我还写这么多干嘛?我第二个参数直接给null不就可以了?其实不然,这里涉及到另外一个问题:我们在开发的过程中给控件所指定的layout_width和layout_height到底是什么意思?该属性的表示一个控件在容器中的大小,就是说这个控件必须在容器中,这个属性才有意义,否则无意义。这就意味着如果我直接将linearlayout加载进来而不给它指定一个父布局,则inflate布局的根节点的layout_width和layout_height属性将会失效(因为这个时候linearlayout将不处于任何容器中,那么它的根节点的宽高自然会失效)。如果我想让linearlayout的根节点有效,又不想让其处于某一个容器中,那我就可以设置root不为null,而attachToRoot为false。这样,指定root的目的也就很明确了,即root会协助linearlayout的根节点生成布局参数,只有这一个作用。
if (root == null || !attachToRoot) {
	result = temp;
}
这里返回的结果中,如果root!=null&&attachToRoot,返回的就是root;否则都是返回temp的view。

注意:
1.如果resource根布局是以<merge>标签开始,则root不能为空,且必须attachToRoot。
2.如果是在AdapterView中,attachToRoot必须为false,否则报出:
java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView
3.如果root!=null&&attachToRoot不为空,需要注意不再要将当前的已被其他parentViewadd的View添加到其他的View上,否则报出:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.








内容概要:本文介绍了一个基于MATLAB实现的无人机三维路径规划项目,采用蚁群算法(ACO)与多层感知机(MLP)相结合的混合模型(ACO-MLP)。该模型通过三维环境离散化建模,利用ACO进行全局路径搜索,并引入MLP对环境特征进行自适应学习与启发因子优化,实现路径的动态调整与多目标优化。项目解决了高维空间建模、动态障碍规避、局部最优陷阱、算法实时性及多目标权衡等关键技术难题,结合并行计算与参数自适应机制,提升了路径规划的智能性、安全性和工程适用性。文中提供了详细的模型架构、核心算法流程及MATLAB代码示例,涵盖空间建模、信息素更新、MLP训练与融合优化等关键步骤。; 适合人群:具备一定MATLAB编程基础,熟悉智能优化算法与神经网络的高校学生、科研人员及从无人机路径规划相关工作的工程师;适合从智能无人系统、自动驾驶、机器人导航等领域的研究人员; 使用场景及目标:①应用于复杂三维环境下的无人机路径规划,如城市物流、灾害救援、军侦察等场景;②实现飞行安全、能耗优化、路径平滑与实时避障等多目标协同优化;③为智能无人系统的自主决策与环境适应能力提供算法支持; 阅读建议:此资源结合理论模型与MATLAB实践,建议读者在理解ACO与MLP基本原理的基础上,结合代码示例进行仿真调试,重点关注ACO-MLP融合机制、多目标优化函数设计及参数自适应策略的实现,以深入掌握混合智能算法在工程中的应用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值