Android:Context对象

时间:2012-03-04 10:18:11

标签: android android-context

在Android上进行编程时,我们在任何地方使用上下文对象(可能是context关键字或this关键字),但我并不真正理解它的用途。

例如,当我们添加UI Component时,TextView

TextView textView = new TextView(this);  //this simple line make me headache
setContentView(textView);

我第一次认为上面的行是:this关键字意味着:此textView将分配给当前屏幕。但在那之后,我发现这是一个错误的想法,因为第setContentView(textView)行做了我的想法。

那么,谁能为我解释一下,在上面的例子中我们宣布context object的目的是什么。 (和其他情况一样,如果你愿意,请告诉我更多:D)

谢谢:)

3 个答案:

答案 0 :(得分:7)

Context对象提供对应用程序资源和其他功能的访问。每个Activity都是Context,每个View都需要Context,因此它可以检索所需的任何资源(包括系统定义的资源等)。

第二行告诉Activity对象使用该特定View(a TextView)作为要为Activity显示的顶级用户界面元素。这与Activity Context之间没有冲突,首先构建TextView。它们是不同的东西。

答案 1 :(得分:7)

在活动中动态创建视图时,您需要Context类。例如,您可能希望从代码中动态创建TextView。为此,您实例化TextView类。 TextView类的构造函数采用Context对象,并且因为Activity类是Context的子类,您可以使用this关键字来表示Context对象。

答案 2 :(得分:3)

为什么需要上下文? The documentation表示每个视图都需要上下文来访问正确的资源(例如主题,字符串等)。

但是为什么在构造函数中而不是通过setContentView(View)

  1. 因为在构造视图时必须可以访问资源(构造函数需要一些资源来完全初始化视图)。

  2. 这允许使用与当前活动不同的上下文的灵活性(想象一个使用其他字符串资源的视图,而不是当前活动的视图)。

  3. Android SDK的设计者似乎选择了上下文必须只设置一次,然后在视图的整个生命周期内保持不变。

  4. 为什么不在施工点自动确定上下文?

    1. 因为没有静态变量可以告诉您应用程序的当前全局上下文。方法getApplicationContext()最接近于此,但它不是静态的,因此您需要Activity对象的实例来调用它。

    2. Java语言提供了一个查看调用堆栈并查找View类中是否已构造Context的选项。但如果有很多呢?或者如果没有怎么办?这种方法非常昂贵且容易出错。因此API的设计者决定手动提供必须的上下文。