【问题标题】:The difference between LayoutInflater.inflate and findViewByIdLayoutInflater.inflate 和 findViewById 的区别
【发布时间】:2015-01-18 21:33:15
【问题描述】:
像这样获取对小部件的引用有什么区别:
TableRow row = findViewById(R.id.table_row);
和:
TableRow row = (TableRow)LayoutInflater.from(this).inflate(R.layout.table_row, null);
TableRow 是其布局的根还是只是布局的一小部分,是否也有区别?
【问题讨论】:
标签:
android
android-widget
layout-inflater
findviewbyid
【解决方案1】:
有什么区别...
第一个是在您的活动中检索现有小部件。
第二个是读取 XML 文件并创建 new 小部件。第二个也有点问题,因为您很少想使用LayoutInflater.from()(您通常在Activity 上使用getLayoutInflater()),并且您很少想使用inflate() 变体(如果您不提供父容器,带有根 RelativeLayout 元素的布局资源会出现异常)。
TableRow 是其布局的根还是只是布局的一小部分,是否也有区别?
是的。区别与以前相同:检索现有小部件或创建新小部件。
【解决方案2】:
1) 使用
TableRow row = findViewById(R.id.table_row);
你只是获得了一个参考到一个View id R.id.table_row 已经在当前布局中创建和膨胀(其中 current 表示Activtiy 的布局或您正在定义的View。
2)使用
TableRow row = (TableRow)LayoutInflater.from(this).inflate(R.layout.table_row, null);
您正在膨胀(这意味着创建)基于 R.layout.table_row 中包含的 XML 定义的新视图层次结构。由于您没有在 inflate() 方法中传递父视图参数,因此您需要手动将生成的层次结构添加到现有容器中。