收听ViewGroup

时间:2016-07-14 01:45:53

标签: android android-layout

我创建了一个非常小的库来更改我的应用程序的字体。

到目前为止,我一直在为布局膨胀之后以及在将TextView添加到布局之后更改字体。它可以工作,但我必须记住,对于涉及TextView的布局中的每一个更改都要执行此操作。对于大型项目和我的代码的长期维护而言,这是不可持续的。

我想要一种方法来监听Activity的布局变化,这样我就可以在那里进行字体更改。

我尝试在我的ViewGroup.OnHierarchyChangeListener上实施Activity,如下所示:

@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)并获取对我View中添加的ViewGroup内容的引用。唯一的问题是,这种获取viewGroup的方法并不包含ActionBar,但只需将同一个侦听器添加到ActionBar即可。

但是,永远不会调用onChildViewAdded

我在Fragment的布局中进行了大多数Activity次交易。我不知道这是否阻止了回调的发生。

我现在正在尝试使用ViewTreeObserver.OnDrawListener,这是可行的方法,还是有另一种解决方法来监听ViewGroup中的更改?

1 个答案:

答案 0 :(得分:1)

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