[英]Listen to changes in ViewGroup
我創建了一個非常小的庫來更改我的應用程序的字體。
到目前為止,我一直在膨脹布局之后以及在將 TextView 添加到我的布局之后更改字體。 它有效,但我必須記住對涉及TextView
布局中的每一個更改都執行此操作。 這對於大型項目和我的代碼的長期維護來說是不可持續的。
我想要一種方法來偵聽Activity
布局的更改,以便我可以在那里進行字體更改。
我嘗試在我的Activity
上實現ViewGroup.OnHierarchyChangeListener
,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
.findViewById(android.R.id.content)).getChildAt(0);
viewGroup.setOnHierarchyChangeListener(this);
}
這似乎是一個很好的解決方案,因為我可以收聽onChildViewAdded(View parent, View child)
並獲得對添加到我的ViewGroup
任何View
的引用。 唯一的問題是,這種獲取viewGroup的方式不包括ActionBar,但只需將相同的偵聽器添加到ActionBar
就足夠了。
但是,永遠不會調用onChildViewAdded
。
我主要在Activity
的布局中進行Fragment
事務。 我不知道這是否是阻止回調發生的原因。
我現在正在嘗試使用ViewTreeObserver.OnDrawListener
,這是要走的路還是有另一種解決方法來偵聽ViewGroup
更改?
view.setOnHierarchyChangeListener()
僅在將視圖專門添加到此視圖時才會給您回調。 當您向此視圖的子視圖添加視圖時,您不會收到任何回調。 您將需要單獨聆聽它們。
查看https://gist.github.com/JakeWharton/7189309上的代碼:
每當向此添加視圖時,將偵聽器附加到所有 ViewGroup 類型子項的層次結構更改。
監聽器中的這段代碼演示了這個想法:
@Override public void onChildViewAdded(View parent, View child) {
delegate.onChildViewAdded(parent, child);
if (child instanceof ViewGroup) {
ViewGroup childGroup = (ViewGroup) child;
childGroup.setOnHierarchyChangeListener(this);
for (int i = 0; i < childGroup.getChildCount(); i++) {
onChildViewAdded(childGroup, childGroup.getChildAt(i));
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.