【问题标题】:How is a context in Android created? What is the purpose of ContextThemeWrapper?Android中的上下文是如何创建的? ContextThemeWrapper 的目的是什么?
【发布时间】:2015-07-16 17:23:07
【问题描述】:

我正在帮助整理这个页面:What is a context?

为了帮助说明组件与Context 的关系,我通过查看框架源代码创建了此图:

经过一番挖掘,我有以下问题:

  1. 什么创建了Context 以及使用了哪些具体类? 基类Context 本身是一个抽象类,几乎需要实现其所有方法。而ContextWrapper 在实例化时需要传入一个Context 实例作为它的基本上下文,因此必须至少有一个具体的Context 类。
  2. 我了解ContextWrapper 及其子类根据需要利用包装器/装饰器模式向基础Context 类添加功能。 ContextThemeWrapper 的用途是什么?它覆盖了一些方法,但如果它包装了一个基 Context,为什么不直接将调用委托给基 Context?例如,Activity 类扩展了ContextThemeWrapper,它为getTheme()setTheme() 提供了具体的实现。为什么?

Android 开发者 java 文档有点含糊。例如,ContextWrapper

【问题讨论】:

标签: android android-context


【解决方案1】:

回答 #2:

ContextThemeWrapper 为上下文添加主题支持,否则您无法将任何主题应用于您创建的视图。这就是为什么 Activity 布局支持主题而小部件布局不支持的原因。您也可以自己创建一个 ContextThemeWrapper 来用另一个主题覆盖当前主题。

【讨论】:

  • 对不起这个愚蠢的问题,但请告诉我什么是 Activity 布局和 Widget 布局?
  • Activity 布局是指带有视图的常规 XML 布局,小部件布局是指包含远程视图的 XML 布局,专门用于主屏幕小部件。
【解决方案2】:

好吧,我参加聚会很晚了,但#1 的答案是我相信ContextImpl 类。它由系统创建,然后在任何时候和任何类(例如 - 活动/应用程序)调用 attach 方法,该方法将 Context 作为参数并在内部调用 ContextWrapper 类的 attachBaseContext 进行设置基本上下文,这个ContextImpl 作为Context 参数传递。 因此ContextImpl 类提供了Context 类的可靠实现。

【讨论】:

    【解决方案3】:

    什么创建了上下文以及使用了哪些具体类? Context 由系统在后台使用 ContextImpl 类实例化。例如,Activity 扩展 ContextThemeWrapper 并从外部接收基本上下文对象。当您在 Android 中使用上下文时,通常最后一个由 ContextWrappers 链和头部的 ContextImpl 实例表示。但是ContextImpl 是一个内部类,作为应用程序开发人员,您不应手动实例化它,而应将Context 视为系统提供的抽象。也许你会发现这篇文章很有用:Which Context should I use in Android?。更重要的是要理解一个上下文可能会绑定到一个主题,它会将我们引向第二个问题。

    ContextThemeWrapper 的用途是什么? 要了解ContextThemeWrapper 类的用途,了解什么是主题覆盖 非常重要。简而言之,ContextThemeWrapper 允许使用所谓的主题覆盖部分覆盖 parent 上下文主题。我推荐来自 Android 团队的this article,它详细描述了主题覆盖。你也可以看看另一个 SO 问题:When should one use Theme.AppCompat vs ThemeOverlay.AppCompat?

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2012-04-26
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      相关资源
      最近更新 更多