2013年12月30日月曜日

レイアウトの階層について(android.R.id.contentなど)

色々とネット上のsampleを見ていると「R.id.content」っていう記述を見かけていましたが、
レイアウト用のxmlにはそのidが振られている記述が無いので、
不思議に思い調べてみると、
内部的に自動でContentViewと呼ばれるビューに割り当てられているidでした(; ・`д・´)

通りでレイアウトのXMLに記述が無いわけですね(゚д゚)(。_。)(゚д゚)(。_。) ウンウン

ContentViewとは、普段onCreateで何気なく使っていたsetContentViewで実行された、
レイアウトビューのことらしいです(´・∀・`)ヘー

ContentViewで設定されたビューの上に、内部的には親ビューとしてFrameLayoutがあるそうです。
このViewに設定されているidが「R.id.content」になっています。

さらにその上に、「DecorView」というビューもあるそうで、
これが実際には、レイアウト階層のルート要素となるそうです。

簡単な階層の関係図を書くと、次のようになります。
DecorView(id無し)
↓
LinearLayout(id無し。全てのビューのルート)
↓
FrameLayout(R.id.content)
↓
ContentView
ContextViewは、次の記述で取得することが可能。
android.R.id.contentは頭にandroidをつけること。

ContextViewの親FrameLayoutの取得方法
ViewGroup contentRoot = (ViewGroup)this.findViewById(android.R.id.content);
or
ViewGroup root = (ViewGroup)getWindow().getDecorView().findViewById(android.R.id.content);
ContentViewの取得(setContentViewで設定したビュー)
View contentView = ((ViewGroup)findViewById(android.R.id.content)).getChildAt(0);
setContentViewがあるのに、getContentViewが無いそうです(´;ω;`)ウッ…

【補足】
全てのビューのルートLinearLayoutの下には、
実際にはFrameLayoutが2つぶら下がっているそうです。

「R.id.content」とは別のFrameLayoutはタイトルバーなどで利用されているものらしいです。
DecorView(id無し)
↓
LinearLayout(id無し。全てのビューのルート)
↓
FrameLayout(id無し)
↓
TextView
次の記述で、TextViewを取得することが可能。
TextView titleBar = (TextView)this.findViewById(android.R.id.title);
タイトルバー、コンテンツのルート共にSDKが内部的にIDを振られているため、直接取得できる

以上です(`・ω・´)ゞビシッ!!

参考URL

0 件のコメント:

コメントを投稿