2012-03-04 28 views
4

在Android上編程,我們到處使用上下文對象(也許context關鍵字或者關鍵字this),但我真的不明白它的目的。安卓:Context對象

例如,當我們添加UI ComponentTextView

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

我第一次覺得上面的線是:this關鍵字的意思是:這個TextView的將被分配到當前屏幕。但在此之後,我發現這是一個錯誤的想法,因爲setContentView(textView)行我認爲。

那麼,誰可以給我解釋一下,什麼樣的目的,當我們在上面的例子聲明context object。 (和其他人的情況下,如果你願意,告訴我更多:d)

謝謝:)

+0

好問題。用同樣的方式,我認爲它是這樣的。 – Steve 2014-06-27 11:36:47

回答

7

在活動中動態創建一個視圖時,您將需要Context類。例如,您可能想要從代碼動態創建TextView。爲此,您將實例化TextView類。 TextView類的構造函數需要Context對象,並且因爲Activity類是Context的子類,所以可以使用this關鍵字來表示Context對象。

+0

這很好地解釋了爲什麼我們在動態創建文本視圖時需要上下文。但是,在動態創建文本視圖數組時,我們不必提及任何上下文。爲什麼 ? TextView [] textview = new TextView [10]; – 2014-12-26 07:57:09

7

一個Context對象提供對應用程序的資源和其他功能。每個ActivityContext每個View需要一個Context所以它可以檢索它需要(包括像系統定義的資源)的任何資源。

第二行告訴Activity對象以使用該特定View(一個TextView)作爲頂層用戶界面元素以顯示該Activity。這與Activity作爲Context首先構建TextView沒有衝突。他們是不同的東西。

+2

對不起,我可以有一個問題:如你所說,'View'需要一個'Context'來使用資源(系統資源,例子)。那麼,他們爲什麼不自動執行? – hqt 2012-03-04 10:53:16

+1

@hqt - Context對象由框架創建,並在構造完成之後但在調用onCreate()方法之前傳遞給Activity。 (這是通過調用從其父類「ContextThemeWrapper」繼承的'attachBaseContext()'方法來完成的。)由於框架(通常)控制「Activity」對象的創建,它可以自動進行此調用。這同樣不適用於'View'對象,因爲它們的創建在你的控制之下。 (請注意,它通過XML中的'View'對象或多或少地自動處理。) – 2012-03-04 17:44:02

+0

很好的解釋。謝謝。 – Steve 2014-06-27 11:35:56

3

它爲什麼需要上下文? The documentation表示每個視圖都需要上下文來訪問正確的資源(例如主題,字符串等)。

但爲什麼在構造函數,而不是通過setContentView(View)

  1. 由於同時認爲目前正在建設資源必須是可訪問(構造函數需要一些資源,充分初始化視圖)。

  2. 這允許使用與當前活動不同的上下文的靈活性(設想使用某些其他字符串資源的視圖而不是當前活動的視圖)。

  3. 了Android SDK的設計師似乎都選擇了上下文必須只能設置一次,然後在整個視圖的壽命保持不變。

爲什麼上下文沒有在施工點自動確定?

  1. 因爲沒有靜態變量會告訴你當前應用程序的全局上下文。方法getApplicationContext()與此最接近,但它不是靜態的,所以您需要一個Activity對象的實例來調用它。

  2. Java語言提供了一個選項來查看調用堆棧並查找View是否已在Context類中構建。但如果有很多呢?或者如果沒有?這種方法非常昂貴並且容易出錯。所以API的設計者決定手動提供上下文必須

+2

和我問Ted Hopp一樣的問題,你能告訴我爲什麼android不會設計他們自動執行嗎?謝謝:) – hqt 2012-03-04 10:58:04

+1

@hqt我編輯了答案。希望它解決你的困境。 – sinharaj 2012-03-04 11:09:12