探索Android 在我们的布局上添加了什么


在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看的图:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值