1

たとえば、コードを書くとき

View view = inflater.inflate(R.layout.main_activity, null);

Androidシステムは何をしますか?

4

2 に答える 2

4

のソースを確認してくださいLayoutInflater。これは抽象クラスであり、その具体的なインスタンスは。を介して取得されgetLayoutInflater()ます。

基本的に、インフレータはルートビューオブジェクト(インフレートされたXMLのルートビューグループ)を作成し、XMLツリーを2回通過して、各子ビューをアタッチします。これは、'include'を処理し、子ビュー間の参照を修正するために再帰的に実行されます。たとえば、RelativeLayoutで実行され、上から下に実行されます。

最初のパスは、各子ビューを再帰的にトップダウンでインスタンス化することによってツリーを構築し、XML属性をビューコンストラクターに渡して、ビューの大きさを通知します。次にmeasure()、メジャー仕様オブジェクトを使用して、親によって決定された制限(たとえば、それぞれがmatch_parentを要求する2つの子ビューを持つRelativeLayout)を渡す各子を呼び出し、ビューの大きさを要求します。ビュー自体がビューグループである場合、同じアルゴリズムを使用して子を測定します。

layout()2番目のパスは、ビュー内に自分自身を配置するために各子で呼び出されたときのレイアウトパスです。親は、メジャーパスで計算された測定値を使用してビューを配置します。 が呼び出され、バッキングビットマップonDraw()から作成されたCanvasが渡されます。DecorView

setContentView()完成したツリーは、またはによって実行されるウィンドウマネージャーに渡す準備ができていますaddContentView()

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/view/LayoutInflater.java#LayoutInflater

于 2012-12-24T17:42:35.247 に答える
0

単純な言語でXMLレイアウトを膨らませることは、XMLinを変換していることを意味しますView。次に、親/膨張したビューを使用して、XMLで宣言された各ビューをフェッチできます。

たとえば-

View view = inflater.inflate(R.layout.main_activity, null);

これviewが、すべてのビューを次のようにフェッチできるXMLのリファレンスです。

TextView tv = (TextView)view.findViewById(R.id.tv);
于 2012-12-24T16:48:56.803 に答える