2015-10-01 89 views
0

更新的Android支持Libary V7程序兼容性 後我不能夠改變風格的標題和以下 不wotking了:Xamarin程序兼容性的TextView定製

int myTitleId = Resources.GetIdentifier("action_bar_title", "id", "android"); 
TextView barTitle = FindViewById<TextView>(myTitleId); 
barTitle.SetTypeface(FontFactory.GetMyFont(this), TypefaceStyle.Normal); 

回答

0

集成新的工具欄後,我改變了風格。

保護覆蓋無效的OnCreate(束束)我的活動(即現在已經擴展AppCompatActivity) 其中前現在是以前的代碼,我有:

toolbar = FindViewById<Toolbar>(Resource.Id.toolbar); 
SetSupportActionBar(toolbar); 

var f = toolbar.Class.GetDeclaredField("mTitleTextView"); 
f.Accessible = true; 
var barTitle = (TextView)f.Get(toolbar); 
barTitle.SetTypeface(FontFactory.GetMyFont(this), TypefaceStyle.Normal); 

我需要還添加這在頂部:

using Java.Lang; //for the reflection 
using Toolbar = Android.Support.V7.Widget.Toolbar; 

,並在layout.axml我包含在這樣的toolbar.axml:

//... 
<include 
android:id="@+id/toolbar" 
layout="@layout/toolbar" /> 
//... 
+0

FWIW:這種方法與您原來的方法不相上下。雖然事情現在可能會奏效,但只要Android團隊決定重命名'mTitleTextView'字段,將其移動到某種代理或完全刪除它,它就一定會中斷。你*不應該依賴框架的內部實現細節,特別是在生產代碼中。如果您不想再次遇到同樣的問題,我會強烈建議採用更強大的方法。 –

0

這是因爲程序兼容性現在使用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是曾經分配給視圖。這也可以很容易地通過檢查視圖層次結構可以看出:

enter image description here

TextView,你看到的是,持有的標題之一。該id是一個生成的值,並且不是預定義的(例如,對於ActionBarContainer),這意味着您不能再通過某種靜態引用來查找它。

這就解釋了爲什麼你的代碼不能使用id查找方式:action_bar_title id在這裏不再使用。

有幾種解決方法可以將自定義字體再次設置爲ActionBar標題工作。最乾淨的可能是利用setTitle()需要CharSequence的事實,這意味着您可以將custom typeface span附加到它,以使自定義字體和/或樣式可以工作。這樣做是某種'基礎'Activity可能是最有意義的。

你當然也可以迭代本地視圖層次結構,從ToolBar開始,但我認爲它不夠穩健,並且容易受到將來更改(如當前代碼)的影響。

或者,考慮使用庫來簡化處理應用自定義字體的處理。 Calligraphy通常是我的第一站。