3

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

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

以及为 R 中的视图生成的 id 到底在哪里?

提前致谢。

4

1 回答 1

5

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

实际上,当您调用setContentView(R.layout.<layout_file_name>);. Android 简而言之,它将从其 id 膨胀给定的布局文件并为您当前的 Activity 准备 View 并放入顶层。

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

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

更新:

好的,看了之后发现,

当你调用Activity基类的setContentView()时,它调用了Window类的setContentView()的Abstract方法,它是Abstract方法,并且这个方法的唯一重写是在PhoneWindow类中。看起来像,

 @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.
于 2013-02-18T09:14:52.690 回答