在Android布局文件中,"tools:context"是什么意思?

1026

从最近的ADT新版本开始,我注意到布局XML文件中有了这个新属性,例如:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".MainActivity" />

"tools:context" 用于什么目的?

它是如何知道那里写的确切活动路径的?它是否查看应用程序包内的清单文件?

它是否仅限于继承Context的类或仅限于活动?它是否可用于ListView项等?


是的,我想知道自己错过了什么其他的东西(没有在“新功能”部分中看到),因为我总是安装最新的adt&sdk版本(目前使用adt&sdk 20预览版3)。 - android developer
10
请参考官方文档:http://tools.android.com/tech-docs/tools-attributes#TOC-tools:context。 - Maxwell175
2
我的应用程序仍然可以在没有上下文的情况下正常工作。 - most venerable sir
1
@user132522,这完全是关于在IDE本身中进行开发,而不是在应用程序运行时。 - android developer
这个怎么样?https://dev59.com/Rp7ha4cB1Zd3GeqPjGta - user8389458
12个回答

503

这是工具UI编辑器用于呈现布局预览的活动。它在这里有记录:

此属性声明默认情况下与此布局相关联的活动。这使得编辑器或布局预览中需要了解活动的功能可以启用,例如预览中布局主题应该是什么,以及在您从快速修复中进行onClick处理时在哪里插入它们。


我明白了。根据这里的截图:http://tools.android.com/_/rsrc/1337185954574/recent/newconfigchooser/activity.png,这意味着它不必是扩展Context的类,对吗?如果是这样,我认为它做得比你说的更多,尽管我不确定具体是什么。 - android developer
2
Activity 扩展了 Context,所以我不确定你的意思是什么?如果你感兴趣的话,它可能确实做了更多的事情,可以查看源代码,它是可用的。我不知道任何细节。 - Nikolay Elenkov
27
他们制作了一个新视频展示这些功能:http://www.youtube.com/watch?feature=player_embedded&v=Erd2k6EKxCQ#t=1166s - android developer
系统如何确定MainActivity属于哪个包? - QED
1
最新的文档链接为 https://developer.android.com/studio/write/tool-attributes.html。 - Clive Sargeant
显示剩余3条评论

395
该属性基本上是与布局上方的“关联活动”选择相关的持久性。在运行时,布局总是与一个活动相关联。当然它可以与多个活动相关联,但至少有一个。在工具中,我们需要知道这种映射(在运行时发生在另一个方向上;活动可以调用setContentView(layout)显示布局)以驱动某些功能。 现在,我们只使用它来选择正确的主题以显示布局(因为清单文件可以注册要用于活动的主题,一旦我们知道与布局相关联的活动,我们就可以选择正确的主题以显示布局)。将来,我们将使用此功能来驱动其他功能,例如呈现操作栏(与活动相关联),添加onClick处理程序的地方等等。 这是一个tools:命名空间属性的原因是,这只是工具使用的设计时映射。布局本身可以被多个活动/片段等使用。我们只想给您提供一种选择设计时绑定的方法,以便我们可以例如显示正确的主题;您可以随时更改它,就像您可以更改我们的listview和fragment绑定一样。

这是完整的变更集,其中有关于this更多的细节。

还有,the link Nikolay 上面列出了新配置选择器的外观和工作方式。

还有一件事: "tools" 命名空间是特殊的。 Android 打包工具知道要忽略它,因此这些属性中没有一个会被打包到 APK 中。 我们在布局中使用它来存储额外的元数据。 还可以将抑制 lint 警告的属性存储在其中-例如 tools:ignore。


2
是的,它与清单文件中的活动注册一样处理,您也可以在名称属性中省略包。如果需要,它会从清单文件根元素添加包声明。 - Tor Norbye
1
在新项目生成的 XML 中,它将 tools:context 值放置在 TextView 字段上。既然这听起来像是应用主题到整个布局的全局用例,为什么不将其放置在根布局中? - Jason Robinson
@androiddeveloper 我是在2012年的IO大会上通过视频了解到这个的。 :) - Dheeraj Bhaskar
这是否意味着 tools:context 相当于我们有时在某些抽象类的实现方法中看到声明变量的 Context context,例如:SQLiteOpenHelper? - hayonj
3
我已添加了一份文档,记录了我们当前工具的属性:http://tools.android.com/tech-docs/tools-attributes。 - Tor Norbye
显示剩余3条评论

97

根据Android工具项目网站的说法:

tools:context

此属性通常设置在布局XML文件中的根元素上,并记录与哪个活动(仅在设计时,因为显然一个布局可以被多个布局使用)相关联。例如,布局编辑器将使用它猜测默认主题,因为主题在清单中定义并与活动相关联,而不是布局。您可以像在清单中一样使用相同的点前缀,只指定活动类而不是完整的应用程序包名称作为前缀。

<android.support.v7.widget.GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"    
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">  

使用者:Studio和Eclipse中的布局编辑器,Lint


15

1.描述

tools: context = "activity name" 这个属性不会被打包进 apk 文件中。只有在你当前的布局文件中设置了相应的渲染上下文,ADT 布局编辑器才能显示你当前布局对应的活动名称所对应的渲染上下文,如果活动在 manifest 文件中设置了主题,那么 ADT 布局编辑器将根据主题渲染当前布局。这意味着,如果你为 MainActivity 设置了一个主题,比如 Light(或其他主题),则你在可视化布局管理器中看到的背景控件应该是该主题的 Light 样式。只是展示给你看你所见即所得的结果。

有些人可能能够理解,而有些人可能不知道,请允许我加入一些解释:

2.示例

以简单的 tools:text 为例,一些更多的图片,方便更深入地理解 tools:context

<TextView
    android:id="@+id/text1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="sample name1" />

<TextView
    android:id="@+id/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:text="sample name2" />

在此输入图片描述

TextView1使用了 android:text 属性,而 TextView2 在布局编辑器的右侧使用了 tools:text 属性。如果代码编译后生成了 apk,终端只会显示 sample name1 而不会显示 sample name2。你可以尝试运行代码,看一下效果。

3.具体说明

1.tools: context = "activity name" 不会被打包进 apk 中(理解:相当于被注释掉,编译没有影响)。

2.只有在当前布局文件中设置对应的渲染上下文,才能在 ADT 布局编辑器中(即模拟器右侧的图标)显示。当前 XML 布局在渲染时所使用的上下文是与之对应的活动名称,如果在清单文件中为活动设置了一个主题,那么 ADT 布局编辑器将根据主题来渲染你的当前布局。这意味着如果你设置了 MainActivity 的主题,它也可以是 Light(或其他主题)。(理解:你添加了 tools: context = "activity name",XML 布局会指定渲染活动,清单文件中建立一个主题,在上面右侧的模拟器主题样式也会相应地随着主题更改而变化。)

4.总结

总之,这些属性主要是针对右侧工具栏、模拟器调试时显示状态以及编译不起作用的问题。


7
“tools:context”是开发框架中可用于在XML中方便地创建布局的设计属性之一。此属性用于向开发框架展示选定的活动类以实现布局。使用“tools:context”,Android Studio会自动选择所需的主题进行预览。 如果您想了解更多关于Android应用程序开发的其他属性和有用工具,请查看此评论:http://cases.azoft.com/4-must-know-tools-for-effective-android-development/

3
这是最佳解决方案: https://developer.android.com/studio/write/tool-attributes 这是设计属性 我们可以在xml中设置活动上下文,例如:
tools:context=".activity.ActivityName"

适配器:

tools:context="com.PackegaName.AdapterName"

在这里输入图片描述

当您单击标记的图标时,可以导航到Java类,工具还具有更多功能。

tools:text=""
tools:visibility:""
tools:listItems=""//for recycler view 

etx


0

tools:context=".MainActivity"这一行代码在xml文件中使用,用于指示哪个Java源文件用于访问此xml文件。它的意思是为特定的Java文件显示此xml预览。


0

其他答案中缺少的一个要素是,任何可用于扩展上下文的类的上下文部分。

tools:context 是在 Android Studio 和 Android Gradle 插件中引入的属性。它用于布局文件中,以指定布局将被使用的上下文。

tools 命名空间用于指定在运行时不使用但由 Android Studio 布局编辑器和其他工具使用的属性,以便更好地控制布局的呈现方式。tools:context 属性允许您指定表示布局上下文的 Java 类的完全限定名称。当布局在编辑器中呈现时,布局编辑器将使用此信息来确定应用于布局的主题和属性。

它查看应用程序包内的清单。它用于了解写在那里的活动的确切路径。

tools:context 属性可与任何扩展 Context 的类一起使用,例如 Activity、Service 或 Application。然而,它最常用于 Activity 类,因为它们是大多数应用程序的主要入口点。

context 属性不仅限于活动,它可以用于扩展上下文的任何 Java 类。它可以用于任何基于上下文的类,例如 ListView 项,但它通常用于活动。


0

根据developer.android.com的说明

适用于:任何根<View>

被使用于:Lint、Android Studio布局编辑器

此属性声明了该布局默认关联的活动。这使得编辑器或布局预览中需要了解活动信息的功能能够启用,例如预览中应该是什么布局主题以及在您从快速修复中创建onClick处理程序时应该插入到哪里(图2)。

enter image description here

图2. 仅当您设置了tools:context时,onClick属性的快速修复才有效。

您可以使用与清单文件中相同的点前缀指定活动类名称(不包括完整包名称)。例如:

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" >

0
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    //more views

</androidx.constraintlayout.widget.ConstraintLayout>
在上面的代码中,tools:context 的基本需求是默认告诉布局文件与哪个活动或片段相关联。因此,您可以使用与 Manifest 文件中相同的点前缀指定活动类名称。 通过这样做,Android Studio 将自动为预览选择必要的主题,您无需手动进行预览设置。我们都知道,一个布局文件可以与多个活动相关联,但主题是在 Manifest 文件中定义的,并且这些主题与您的活动相关联。因此,通过在布局文件中添加 tools:context,Android Studio 预览将自动为您选择必要的主题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,