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オブジェクトを作成します。なんらかの理由で1秒間に数百回呼び出すと気になるかもしれません。違いはわかりませんが、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);

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

動作しない:(..この場合、変数アイコンはnullです

CardView myCardView = new CardView(getActivity());

ImageViewアイコン=(ImageView)myCardView.findViewById(R.id.iconId);

于 2015-12-13T20:42:36.563 に答える