寻找布局背景图

时间:2022-06-05 05:26:53

今天在研究demo的时候发现一个奇特的现象,就是一个空白的Layout预览的时候居然有一副背景图,代码如图:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/id_mian"
android:orientation="vertical">


</LinearLayout>

效果如图:

寻找布局背景图

但是该demo在AndroidStudio里面却又是正常的,xml代码都是一样的,预览及xml代码如图:

寻找布局背景图

面对这个问题,我首先去Activity里面寻找到该图片“splash_bg”,然后在Eclipse寻找该图片的引用,后来在主题(样式)里面发现如下代码:

<style name="MainTabActionBarTheme" parent="@android:style/Theme.Light.NoTitleBar.Fullscreen">
<item name="android:windowFullscreen">true</item>
<item name="android:windowBackground">@drawable/splash_bg</item>
</style>

并且该主题是在文件清单里被Activity所引用的,所以加载的效果完全一样。但是这里预览的时候为什么不一样呢?因为我们在xml布局里面并没有发现该文件指向任何Context,所以按照常规理解,该布局应该是一个空白的Layout,预览效果正常的话应该是AndroidStudio预览的这种效果。但是这里预览的时候显示出了主题赋值的背景图片,是怎么一回事呢?

首先,我们应该明白几个概念:Activity、Window、DecorView。根据事件分发机制的传递规则,可以将窗口分为几个等级,即Activity->Window->DecorView->Viewgroup……
我们这里的Layout在Activity通过setContentView()方法赋值给*View即DecorView,而DecorView也拿到一个空白的Layout,所以也是空白的。然后Window这里也是空白的,但是主题这里为Window增加了一个背景图片,所以加载Apk的时候显示会是先显示一下背景图片,然后才是Java代码增加的其它View。
我们明白了Apk加载效果显示的这张图片,但是我们这里是寻找布局背景图,我们Layout还并没有赋值给DecorView,并没有赋值给Window,但是显示的却是Window的背景图,这个原因是什么呢?
后来我猜是否Eclipse预览的时候是否已经经过AndroidManifest文件编译,即预览的是AndroidManifest文件编译后的效果?
如果不是的话,那么这个Window的背景图是怎么加载到xml布局的呢?求大神赐教!!!