【问题标题】:Where exactly layout inflation takes place?布局膨胀究竟发生在哪里?
【发布时间】:2013-02-18 08:59:50
【问题描述】:

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

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

还有在哪里为 R 中的视图生成 id?

提前致谢。

【问题讨论】:

标签: android android-layout layout-inflater


【解决方案1】:

较少的文档和编写的基本过程和调用setContentView() 和其他方法的调用。

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

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

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

更新:

好的,我找到了,

当你调用Activity基类的setContentView()时,它会调用Window Class的setContentView()的Abstract方法,也就是Abstract方法,而这个方法的唯一覆盖是在PhoneWindowClass中。看起来像,

 @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();
        }
    }

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

更新: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.

【讨论】:

  • 我认为 OP 想知道(在源代码中)布局充气机的位置。你能指出他确切发生通货膨胀的安卓源代码吗?
  • @user370305 就是这样。为您的进一步努力 +1 :)
  • @user1780366 - 欢迎好友..!快乐编码..!您也可以为答案投票。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多