2016-09-21 29 views
4

我有時會將Dagger的鏈接注入LayoutInflater,並從應用程序上下文中生成它,如下所示:LayoutInflater.from(application);。它減少了代碼行。inflater是否需要Activity的上下文?

但學校告訴我,這是錯誤的方式,它具有由LayoutInflater.from(MainActivity.this);

是真的從活動方面給予?佈局充氣器的行爲是否取決於上下文的類型?

回答

0

如果您知道自己需要上下文來獲取可能比您可以使用的任何其他可能上下文更長的內容(如services),則可以使用getApplicationContext()

因此,當您不需要長時間或全球範圍的對象時,最好使用activity context

希望它會有所幫助。

+0

是的,謝謝。但問題是關於LayoutInflater。如果使用從應用程序上下文生成的LayoutInflater,我會看UI中的任何區別嗎? – tse

+0

不,你不會。所以使用活動上下文來改善內存管理。 – KDeogharkar

1

如果我理解正確,在使用應用程序上下文創建LayoutInflater的情況下,您有機會放棄您的主題設置。請參閱more的詳細信息。

修訂

source code of layout inflater

Object[] args = mConstructorArgs; 
args[1] = attrs; 

constructor.setAccessible(true); 
final View view = constructor.newInstance(args); 
if (view instanceof ViewStub) { 
    // Use the same context when inflating ViewStub later. 
    final ViewStub viewStub = (ViewStub) view; 
    viewStub.setLayoutInflater(cloneInContext((Context) args[0])); 
} 
return view; 

正如你所看到的,你的情況下(在你的情況下,應用程序上下文)經過鑑於結構。這意味着你的觀點範圍將是應用程序,而不是活動。

2

是的,這是真的。考慮風格有很大的不同。

LayoutInflater通過調用它們的構造函數來創建視圖。它通過你傳遞給它的上下文。因此,如果您使用應用程序上下文而不是活動上下文,則可能缺少一些信息。

這和使用應用程序上下文直接創建視圖一樣。活動可以定義不同的樣式,其上下文包裝這些信息。

考慮到你如何得到它,沒有太大的區別。調用內部LayoutInflater.cloneInContext(Context)以應用不同的上下文配置。

創建一個現有的LayoutInflater對象的副本,其副本指向與原始副本不同的Context。這被ContextThemeWrapper用來創建新的LayoutInflater以配合新的Context主題。

有了應用程序上下文,你不會得到這個。

1

如果我們應用程序上下文意味着,inflater實例存在於整個應用程序中,直到應用程序被終止。在其他情況下,如果我們使用活動上下文,一旦活動被破壞,inflater實例將被移除。

相關問題