gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:58:44 26 4
gpt4 key购买 nike

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

当我们 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com