2012-06-04 25 views
1

我正在使用LayoutInflater上的Factory接口,以便能夠在我的應用程序中的所有TextView上設置自定義字體。不幸的是,我的應用程序中有些地方不起作用。經過調查後,似乎在我的ListView的適配器中,用於膨脹單元格的LayoutInflater與應用程序其餘部分使用的LayoutInflater不同(我的活動具有Fragments的複雜結構)。在應用程序中實例化多少個LayoutInflater?

這種行爲是否正常?我如何確保始終使用相同的LayoutInflater,無論我如何檢索它?

感謝

+0

**不幸的是,有些地方在我的應用程序中它不起作用。**什麼意思是「它不工作」?正如AedonEtLIRA在他們的回答中所說的那樣,發佈不起作用的代碼。 – Squonk

回答

0

我不認爲LayoutInflaters的數量真的很重要(除非你是成千上萬個)。但是,是的,使用多個Inflater確實很正常。在使用我的適配器視圖時,我使用了很多(因爲我不使用一個靜態視圖,每個適配器仍然只使用一個)。

如果代碼中有些地方適配器不起作用,您可能會錯過某些東西。我會在Inflater不工作的地方發佈代碼。

1

當你需要參考LayoutInflaterContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)ViewGroup.inflateActivity.getLayoutInflater只是方便的包裝),我相信它總是返回參照同充氣服務,直到它被破壞並重新創建,然後這個新創建的返回,等on ...我認爲從getSystemService方法獲得的manager對象就像「普通」服務的binder對象一樣。

編輯: ,說上面我錯了;)

我檢查了源代碼,並在android.view.ContextThemeWrapper(這是活動中的超級類):

@Override public Object getSystemService(String name) { 
    if (LAYOUT_INFLATER_SERVICE.equals(name)) { 
     if (mInflater == null) { 
      mInflater = LayoutInflater.from(mBase).cloneInContext(this); 
     } 
     return mInflater; 
    } 
    return mBase.getSystemService(name); 
} 

和機器人.app.ContextImpl這可能是MBASE上下文實現:

public Object getSystemService(String name) { 
    ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); 
    return fetcher == null ? null : fetcher.getService(this); 
} 

其中: 私有靜態最後的HashMap SYSTEM_SERVICE_MAP = new HashMap();

和ServiceFetcher是緩存和檢索「系統服務實例」的內部類。

確定每個activity/ContextWrapper有一個LayoutInflater。對於更多的觀察研究來源,請;)

相關問題