這是因爲程序兼容性現在使用ToolBar
部件作爲ActionBar的替代品。 ToolBar
即時爲標題創建一個TextView
實例;如果你深入到(android.support.v7.widget.)ToolBar
代碼,你會發現這樣的事情:
mTitleTextView = new TextView(context);
(參考appcompat-v7-23.0.1-sources.jar
排隊的android.support.v7.widget.ToolBar
607)
更重要的是,沒有ID是曾經分配給視圖。這也可以很容易地通過檢查視圖層次結構可以看出:
這TextView
,你看到的是,持有的標題之一。該id是一個生成的值,並且不是預定義的(例如,對於ActionBarContainer
),這意味着您不能再通過某種靜態引用來查找它。
這就解釋了爲什麼你的代碼不能使用id查找方式:action_bar_title
id在這裏不再使用。
有幾種解決方法可以將自定義字體再次設置爲ActionBar標題工作。最乾淨的可能是利用setTitle()
需要CharSequence
的事實,這意味着您可以將custom typeface span附加到它,以使自定義字體和/或樣式可以工作。這樣做是某種'基礎'Activity
可能是最有意義的。
你當然也可以迭代本地視圖層次結構,從ToolBar
開始,但我認爲它不夠穩健,並且容易受到將來更改(如當前代碼)的影響。
或者,考慮使用庫來簡化處理應用自定義字體的處理。 Calligraphy通常是我的第一站。
FWIW:這種方法與您原來的方法不相上下。雖然事情現在可能會奏效,但只要Android團隊決定重命名'mTitleTextView'字段,將其移動到某種代理或完全刪除它,它就一定會中斷。你*不應該依賴框架的內部實現細節,特別是在生產代碼中。如果您不想再次遇到同樣的問題,我會強烈建議採用更強大的方法。 –