7

我想知道是否有人可以对动态创建控件(膨胀与实例化)的最佳实践有所了解。

膨胀:

TextView styledText = (TextView)inflater.inflate(R.layout.styledTextView);

实例化:

TextView styledText = new TextView(mContext);
styledText.setTextAppearance(R.style.StyledTextStyle);

正在创建的对象可以包含扩展 XML 文件中的属性,也可以包含在样式定义中,该定义随后将添加到实例化对象中。(假设此样式包括宽度、背景、文本颜色等)。

无法对每种方法运行任何时间/内存测试,想知道是否有人知道哪种方法最快/最有效。

4

2 回答 2

11

LayoutInflator 有一点开销,因为它必须解析 xml 才能构建对象。出于同样的原因,它也会暂时占用更多内存。除此之外,它以与您相同的方式构建 View 对象。如果您出于某种原因每秒调用数百次,则可能需要担心。99.9% 的时间虽然你永远不会知道其中的区别。

还要注意,任何接受像“setTextAppearance”这样的 xml 资源的方法都将具有相同的 xml 解析开销。您提供的示例的唯一区别是它不解析 TextView xml,但它仍然必须解析样式属性。

于 2012-09-17T14:21:06.377 回答
0

尽管这篇文章专门询问了控件,但我认为需要注意的是..对于使用要动态创建/添加的布局,我发现在使用new(又名实例化)方法时,我无法获得参考在我为其实例化布局对象引用的 xml 文件中定义的内部 ImageButton 元素。

当我使用该inflate方法时,ImageButton 在引用时出现。

所以在我的情况下:

作品:)

    LayoutInflater inflater = LayoutInflater.from(getActivity());
    CardView myCardView = (CardView) inflater.inflate(R.layout.my_cardview, null);
    ImageView icon = (ImageView) myCardView.findViewById(R.id.iconId);

~~~~~~~~~~~~

不工作:( .. 在这种情况下,变量图标为空

CardView myCardView = new CardView(getActivity());

ImageView 图标 = (ImageView) myCardView.findViewById(R.id.iconId);

于 2015-12-13T20:42:36.563 回答