聆听 ViewGroup 中的变化

buz*_*ert 4 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);
    }
Run Code Online (Sandbox Code Playgroud)

这似乎是一个很好的解决方案,因为我可以聆听onChildViewAdded(View parent, View child)并获得对View添加到我的ViewGroup. 唯一的问题是,这种获取viewGroup的方式不包括ActionBar,而只需向其中添加相同的侦听器ActionBar就足够了。

但是,onChildViewAdded永远不会被调用。

我主要Fragment在 myActivity的布局内进行交易。我不知道这是否是阻止回调发生的原因。

我现在正在尝试ViewTreeObserver.OnDrawListener,这是要走的路还是有另一种解决方法来侦听 a 中的更改ViewGroup

小智 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));
      }
    }
}
Run Code Online (Sandbox Code Playgroud)