在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)
谢谢:)
答案 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)?
因为在构造视图时必须可以访问资源(构造函数需要一些资源来完全初始化视图)。
这允许使用与当前活动不同的上下文的灵活性(想象一个使用其他字符串资源的视图,而不是当前活动的视图)。
Android SDK的设计者似乎选择了上下文必须只设置一次,然后在视图的整个生命周期内保持不变。
为什么不在施工点自动确定上下文?
因为没有静态变量可以告诉您应用程序的当前全局上下文。方法getApplicationContext()最接近于此,但它不是静态的,因此您需要Activity
对象的实例来调用它。
Java语言提供了一个查看调用堆栈并查找View
类中是否已构造Context
的选项。但如果有很多呢?或者如果没有怎么办?这种方法非常昂贵且容易出错。因此API的设计者决定手动提供必须的上下文。