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