たとえば、コードを書くとき
View view = inflater.inflate(R.layout.main_activity, null);
Androidシステムは何をしますか?
たとえば、コードを書くとき
View view = inflater.inflate(R.layout.main_activity, null);
Androidシステムは何をしますか?
のソースを確認してくださいLayoutInflater
。これは抽象クラスであり、その具体的なインスタンスは。を介して取得されgetLayoutInflater()
ます。
基本的に、インフレータはルートビューオブジェクト(インフレートされたXMLのルートビューグループ)を作成し、XMLツリーを2回通過して、各子ビューをアタッチします。これは、'include'を処理し、子ビュー間の参照を修正するために再帰的に実行されます。たとえば、RelativeLayout
で実行され、上から下に実行されます。
最初のパスは、各子ビューを再帰的にトップダウンでインスタンス化することによってツリーを構築し、XML属性をビューコンストラクターに渡して、ビューの大きさを通知します。次にmeasure()
、メジャー仕様オブジェクトを使用して、親によって決定された制限(たとえば、それぞれがmatch_parentを要求する2つの子ビューを持つRelativeLayout)を渡す各子を呼び出し、ビューの大きさを要求します。ビュー自体がビューグループである場合、同じアルゴリズムを使用して子を測定します。
layout()
2番目のパスは、ビュー内に自分自身を配置するために各子で呼び出されたときのレイアウトパスです。親は、メジャーパスで計算された測定値を使用してビューを配置します。 が呼び出され、バッキングビットマップonDraw()
から作成されたCanvasが渡されます。DecorView
setContentView()
完成したツリーは、またはによって実行されるウィンドウマネージャーに渡す準備ができていますaddContentView()
。
単純な言語でXMLレイアウトを膨らませることは、XML
inを変換していることを意味しますView
。次に、親/膨張したビューを使用して、XMLで宣言された各ビューをフェッチできます。
たとえば-
View view = inflater.inflate(R.layout.main_activity, null);
これview
が、すべてのビューを次のようにフェッチできるXMLのリファレンスです。
TextView tv = (TextView)view.findViewById(R.id.tv);