android - 布局膨胀到底发生在哪里?

标签 android android-layout layout-inflater

您好,这些问题似乎很基本,但我还没有找到任何答案。

当我们 setContentView(R.layout.somelayout) 时,我们的布局 XML 文件会被 LayoutInflater 服务膨胀。但我想知道它到底发生在哪里。我没有在激活 xml 文件的 Activity 源代码中找到任何代码。

还有为 R 中的 View 生成 ID 的确切位置?

提前致谢。

最佳答案

为基本过程编写的文档更少,调用调用 setContentView()等方法。

实际上,当您调用 setContentView(R.layout.<layout_file_name>); 时. Android nutshell 进入画面,它将根据其 id 扩充给定的布局文件,并为您当前的 Activity 准备 View 并放入顶层。

What happen when you call setContentView(R.layout.<layout_name>) ?

Android 系统接收到这个引用并使用它来使树失效、测量和绘制树。层次结构的根节点请求其子节点绘制自己——在 反过来,每个 View 组节点负责调用它自己的每个 subview 来绘制它们自己。子对象可能会请求父对象的大小和位置,但父对象对每个子对象的大小有最终决定权。 Android 按顺序(从层次结构树的顶部开始)解析布局的元素,实例化 View 并将它们添加到它们的父级。因为这些是按顺序绘制的,如果有重叠位置的元素, 最后绘制的将位于之前绘制到该空间的其他元素之上。

更新:

好的,看了之后发现,

当您调用 setContentView() 时Activity 基类,它调用 Window 类的抽象方法 setContentView()这是抽象方法,唯一覆盖此方法的方法是在 PhoneWindow 中类(class)。看起来像,

 @Override
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        mLayoutInflater.inflate(layoutResID, mContentParent);
        final Callback cb = getCallback();
        if (cb != null) {
            cb.onContentChanged();
        }
    }

所以 View 膨胀发生在这个类中。

更新:2关于R.java文件生成..

Aapt(Android Asset Packaging Tool) – 此工具编译所有 XML 布局文件和 AndroidManifest.xml文件。除了编译版本之外,这还会生成一个 R.java包含编译资源的所有引用的文件。

存储在 res 子目录中的资源包括图标、布局和字符串等内容。这些是使用 aapt 工具编译到名为 R.java 的文件中的。 , 存储在 gen/子目录。

来自 aapt 帮助

aapt p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \
        [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \
        [--min-sdk-version VAL] [--target-sdk-version VAL] \
        [--max-sdk-version VAL] [--app-version VAL] \
        [--app-version-name TEXT] [--custom-package VAL] \
        [-I base-package [-I base-package ...]] \
        [-A asset-source-dir]  [-G class-list-file] [-P public-definitions-file] \
        [-S resource-sources [-S resource-sources ...]]         [-F apk-file] [-J R-file-dir] \
        [raw-files-dir [raw-files-dir] ...]

   Package the android resources.  It will read assets and resources that are
   supplied with the -M -A -S or raw-files-dir arguments.  The -J -P -F and -R
   options control which files are output.

aapt 的命令:(对于 HelloWorld Android 应用程序)

aapt \package -v -f -m -M AndroidManifest.xml -S .\bin\res -S .\res \
   -I C:\local\android-sdk-windows\platforms\android-15\android.jar \
   -J .\gen --generate-dependencies

结果看起来像,

Configurations:
 (default)
 hdpi
 ldpi
 mdpi

Files:
  drawable\ic_launcher.png
    Src: (hdpi) .\res\drawable-hdpi\ic_launcher.png
    Src: (ldpi) .\res\drawable-ldpi\ic_launcher.png
    Src: (mdpi) .\res\drawable-mdpi\ic_launcher.png
  layout\main.xml
    Src: () .\res\layout\main.xml
  values\strings.xml
    Src: () .\res\values\strings.xml
  AndroidManifest.xml
    Src: () AndroidManifest.xml

Resource Dirs:
  Type drawable
    drawable\ic_launcher.png
      Src: (hdpi) .\res\drawable-hdpi\ic_launcher.png
      Src: (ldpi) .\res\drawable-ldpi\ic_launcher.png
      Src: (mdpi) .\res\drawable-mdpi\ic_launcher.png
  Type layout
    layout\main.xml
      Src: () .\res\layout\main.xml
  Type values
    values\strings.xml
      Src: () .\res\values\strings.xml
Including resources from package: \
C:\local\android-sdk-windows\platforms\android-15\android.jar
applyFileOverlay for drawable
trying overlaySet Key=ic_launcher.png
baseFile 0 has flavor ,,,,,,,,,,,hdpi,,,,,,,
baseFile 1 has flavor ,,,,,,,,,,,ldpi,,,,,,,
baseFile 2 has flavor ,,,,,,,,,,,mdpi,,,,,,,
overlayFile 0 has flavor ,,,,,,,,,,,hdpi,,,,,,,
overlayFile 1 has flavor ,,,,,,,,,,,ldpi,,,,,,,
overlayFile 2 has flavor ,,,,,,,,,,,mdpi,,,,,,,
found a match (0) for overlay file ic_launcher.png, \
for flavor ,,,,,,,,,,,hdpi,,,,,,,
found a match (1) for overlay file ic_launcher.png, \
for flavor ,,,,,,,,,,,ldpi,,,,,,,
found a match (2) for overlay file ic_launcher.png, \
for flavor ,,,,,,,,,,,mdpi,,,,,,,
applyFileOverlay for layout
applyFileOverlay for anim
applyFileOverlay for animator
applyFileOverlay for interpolator
applyFileOverlay for xml
applyFileOverlay for raw
applyFileOverlay for color
applyFileOverlay for menu
applyFileOverlay for mipmap
    (new resource id ic_launcher from \
    .\bin\res\drawable-hdpi\ic_launcher.png)
    (new resource id ic_launcher from \
    .\bin\res\drawable-ldpi\ic_launcher.png)
    (new resource id ic_launcher from \
    .\bin\res\drawable-mdpi\ic_launcher.png)
    (new resource id main from .\res\layout\main.xml)
  Writing symbols for class R.

关于android - 布局膨胀到底发生在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14932565/

相关文章:

android - Multidex 项目中几个新的 Proguard 问题 Google Play 服务 v10.2.6 到 v11.0.0

android - 如何在未安装 Google Play 服务的情况下解决 javax.net.ssl.SSLHandshakeException 错误?

android - 防止 Android TextViews 将价格读取为数字

android - 通过修改将 View 转换为位图

android - onCreateView 中的 mainLayout 不适用于 4.4 及更低版本

java - 使用viewpager android单击按钮时幻灯片中的幻灯片变化

android - CenterCrop 在通用图像加载器 : Android 中不起作用

android - 如何检测 SearchView 后退按钮按下?

android - 膨胀多个实例时无法获得对 View 的单独引用

c# - 在布局充气机中获取 “an object reference is required to access non-static member”