在Activity的oncreate里我们设置内容的时候需要调用setContentView,那么setContentView干了什么呢?
<span style="font-size:18px;">public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
initActionBar();
}</span>
从方法里看出来 1.设置内容 2.初始化ActionBar
在initActionBar();里:
<ol><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">private void initActionBar() {</span></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> Window window = getWindow();</span></span></li><li><span style="font-size:18px;">
</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> // Initializing the window decor can change window feature flags.</span></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> // Make sure that we have the correct set before performing the test below.</span></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> window.getDecorView();</span></span></li><li><span style="font-size:18px;">
</span></li><li><span style="font-size:18px;"><span style="font-family: Arial, Helvetica, sans-serif;"> if (isChild() ||</span><span style="color:#ff6666;font-family: Arial, Helvetica, sans-serif;"> !window.hasFeature(Window.FEATURE_ACTION_BAR) </span><span style="font-family: Arial, Helvetica, sans-serif;">|| mActionBar != null) {</span></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> return;</span></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> }</span></span></li><li><span style="font-size:18px;">
</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> mActionBar = new ActionBarImpl(this);</span></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);</span></span></li><li><span style="font-size:18px;">
</span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> mWindow.setDefaultIcon(mActivityInfo.getIconResource());</span></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> mWindow.setDefaultLogo(mActivityInfo.getLogoResource());</span></span></li><li><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> }</span></span></li></ol>
我们可以看到 为什么如果我们要调用requestFeature,就必须要在setContent之前了。
以上题外话,我们知道执行完setContentView之后,Android系统会给我们添加一层Id为 content的FrameLayout,于是我就想知道,屏幕上除了显示的View还有什么呢?我打算一探究竟:
我知道的探索的方法有两种:
1.利用sdk/tools/hierarchyviewer.bat 查看 比较简单 不过要求是手机已经root。
2.代码方式,这个比较简单 但是看到的东西没有用hierarchyviewer看得多。
1.首先 setContentView(R.layout.activity_main); 这个View里有一个rl (不知道放不同的View会不会有影响)
<span style="font-size:18px;">找到这个View RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);</span>
然后通过这个View的 getParent来获得他的父View
<span style="font-size:18px;">ViewParent vp = rl.getParent();</span>
通过调试 发现它是一个 FrameLayout
同理继续:
<span style="font-size:18px;">ViewParent vvp = vp.getParent();</span>
发现这个vvp是一个叫ActionBarOverlayLayout的一个ViewGroup,
不仅如此,它除了FrameLayout之外还有两个子View,一个LinearLayout,一个ActionBarContainer
这个ActionBarContainer extends NineFrame 而NineFrame extends FrameLayout 说来ActionBarContainer算是个FrameLayout;
我觉得这个LinearLayout是用来放顶部的ActionBar的。
再继续会发现,再上面是一个 PhoneWindow$DecorView,而这里也到顶了,再上去获得的是null了。
至于为什么叫PhoneWindow$DecorView,我只知道DecorView是被WindowManager添加在Window里的。
PhoneWindow是一个Android的基本窗口系统,每个Activity都会有一个,是Activity与View交接的接口。
DecorView据说是个FrameLayout...
截一个hierarchyviewer看的图: