13

私の質問は: xLayout (または ViewGroup 一般) が XML から子ビューを追加する時期を知りたいですか? また、「いつ」とは、コードのどの時点、UI ツールキットの「トラバーサル」のどの「パス」を意味するのでしょうか? xLayout または ViewGroup のどのメソッドをオーバーライドする必要がありますか?

宿題を終えました: 前回の Google I/O で (Adam Powell と Romain Guy によって) 提示された"Writing Custom Views For Android"を見ました。

4

2 に答える 2

8

XML で定義された ViewGroup について話している場合、その子はビューが膨張したときに追加されます。これは、 で明示的にインフレートする場合、LayoutInflaterまたはアクティビティのコンテンツ ビューを設定する場合です。(特にスタブ ビューを使用している場合は、他にもいくつかの場合があります。)

インフレートされていない に自分で子を追加したい場合ViewGroupは、ビューのコンストラクターでそれを行うことができます。

編集:ビューが膨張したときに子がどのように追加されるかを確認したい場合、これは への呼び出しで発生しますLayoutInflater.inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)。のソースandroid.view.LayoutInflaterは Android SDK ディストリビューションに含まれています。オンライン バージョンは、多くの場所で見つけることができます (たとえば、ここでは GrepCode )。このメソッドは、たとえば、 を呼び出すときsetContentView(int)Activityまたはレイアウト リソースを明示的に膨張させるときに呼び出されます。

子は実際にはrInflate(parser, root, attrs, false);("recursive inflate")の呼び出しに追加されます。これはinflate()、インフレータがルート タグとして見つけたものに応じて、メソッド内のいくつかの異なる場所から呼び出される可能性があります。コード ロジックを自分でトレースできます。興味深い点は、子が親に追加されるのは、それ自身の子が再帰的に膨らませられて親に追加されるまでです。

inflateと の両方で使用されるもう 1 つの興味深い方法はrInflate、 ですcreateViewFromTagLayoutInflater.Factoryこれは、インストール可能(または.Factory2オブジェクト) に依存してビューを作成するか、最終的に を呼び出す可能性がありcreateViewます。そこでは、ビューの 2 つの引数のコンストラクター ( ) の呼び出しがどのように行われるかを確認できます(Context context, AttributeSet attrs)

于 2013-06-27T03:41:14.410 に答える