簡體   English   中英

聆聽 ViewGroup 中的變化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM