监听ViewGroup中的变化。

4
我创建了一个非常小的库,用于更改我的应用程序中的字体。
到目前为止,我一直在膨胀布局后和将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的引用。唯一的问题是这种方法无法包括ActionBar,但将相同的监听器添加到ActionBar即可。

然而,onChildViewAdded从未被调用。

我主要在我的Activity布局中执行Fragment事务。我不知道这是否阻止了回调的发生。

现在我正在尝试使用ViewTreeObserver.OnDrawListener,这是正确的方法还是有其他解决方法来监听ViewGroup中的更改?

1个回答

6
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));
      }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接